From 70b77a0fc329e2e205a596a738c7307d354e7b1c Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Tue, 14 Apr 2015 09:24:55 +0200 Subject: library clean-up: Don't build and link libXfont.a anymore. Use system's libXfont shared library and link dynamically. --- nx-X11/lib/font/Type1/AFM.h | 62 - nx-X11/lib/font/Type1/Imakefile | 91 -- nx-X11/lib/font/Type1/afm.c | 200 --- nx-X11/lib/font/Type1/arith.c | 486 ------- nx-X11/lib/font/Type1/arith.h | 77 - nx-X11/lib/font/Type1/blues.h | 95 -- nx-X11/lib/font/Type1/cidchar.c | 621 -------- nx-X11/lib/font/Type1/cluts.h | 35 - nx-X11/lib/font/Type1/curves.c | 228 --- nx-X11/lib/font/Type1/curves.h | 44 - nx-X11/lib/font/Type1/digit.h | 64 - nx-X11/lib/font/Type1/fontfcn.c | 709 --------- nx-X11/lib/font/Type1/fontfcn.h | 250 ---- nx-X11/lib/font/Type1/fonts.h | 49 - nx-X11/lib/font/Type1/hdigit.h | 94 -- nx-X11/lib/font/Type1/hints.c | 890 ------------ nx-X11/lib/font/Type1/hints.h | 48 - nx-X11/lib/font/Type1/lines.c | 189 --- nx-X11/lib/font/Type1/lines.h | 39 - nx-X11/lib/font/Type1/minimain.c | 48 - nx-X11/lib/font/Type1/module/Imakefile | 99 -- nx-X11/lib/font/Type1/module/type1mod.c | 91 -- nx-X11/lib/font/Type1/objects.c | 1101 -------------- nx-X11/lib/font/Type1/objects.h | 354 ----- nx-X11/lib/font/Type1/paths.c | 1406 ------------------ nx-X11/lib/font/Type1/paths.h | 239 ---- nx-X11/lib/font/Type1/pictures.h | 50 - nx-X11/lib/font/Type1/range.h | 48 - nx-X11/lib/font/Type1/regions.c | 1651 --------------------- nx-X11/lib/font/Type1/regions.h | 250 ---- nx-X11/lib/font/Type1/scanfont.c | 2370 ------------------------------- nx-X11/lib/font/Type1/spaces.c | 998 ------------- nx-X11/lib/font/Type1/spaces.h | 172 --- nx-X11/lib/font/Type1/strokes.h | 38 - nx-X11/lib/font/Type1/t1funcs.c | 1668 ---------------------- nx-X11/lib/font/Type1/t1hdigit.h | 40 - nx-X11/lib/font/Type1/t1imager.h | 84 -- nx-X11/lib/font/Type1/t1info.c | 1096 -------------- nx-X11/lib/font/Type1/t1intf.h | 143 -- nx-X11/lib/font/Type1/t1io.c | 388 ----- nx-X11/lib/font/Type1/t1malloc.c | 759 ---------- nx-X11/lib/font/Type1/t1snap.c | 85 -- nx-X11/lib/font/Type1/t1stdio.h | 101 -- nx-X11/lib/font/Type1/t1stub.c | 56 - nx-X11/lib/font/Type1/t1test.c | 246 ---- nx-X11/lib/font/Type1/t1unicode.c | 251 ---- nx-X11/lib/font/Type1/t1unicode.h | 25 - nx-X11/lib/font/Type1/token.c | 1208 ---------------- nx-X11/lib/font/Type1/token.h | 79 -- nx-X11/lib/font/Type1/tokst.h | 510 ------- nx-X11/lib/font/Type1/trig.h | 41 - nx-X11/lib/font/Type1/type1.c | 1892 ------------------------ nx-X11/lib/font/Type1/util.c | 222 --- nx-X11/lib/font/Type1/util.h | 217 --- 54 files changed, 22297 deletions(-) delete mode 100644 nx-X11/lib/font/Type1/AFM.h delete mode 100644 nx-X11/lib/font/Type1/Imakefile delete mode 100644 nx-X11/lib/font/Type1/afm.c delete mode 100644 nx-X11/lib/font/Type1/arith.c delete mode 100644 nx-X11/lib/font/Type1/arith.h delete mode 100644 nx-X11/lib/font/Type1/blues.h delete mode 100644 nx-X11/lib/font/Type1/cidchar.c delete mode 100644 nx-X11/lib/font/Type1/cluts.h delete mode 100644 nx-X11/lib/font/Type1/curves.c delete mode 100644 nx-X11/lib/font/Type1/curves.h delete mode 100644 nx-X11/lib/font/Type1/digit.h delete mode 100644 nx-X11/lib/font/Type1/fontfcn.c delete mode 100644 nx-X11/lib/font/Type1/fontfcn.h delete mode 100644 nx-X11/lib/font/Type1/fonts.h delete mode 100644 nx-X11/lib/font/Type1/hdigit.h delete mode 100644 nx-X11/lib/font/Type1/hints.c delete mode 100644 nx-X11/lib/font/Type1/hints.h delete mode 100644 nx-X11/lib/font/Type1/lines.c delete mode 100644 nx-X11/lib/font/Type1/lines.h delete mode 100644 nx-X11/lib/font/Type1/minimain.c delete mode 100644 nx-X11/lib/font/Type1/module/Imakefile delete mode 100644 nx-X11/lib/font/Type1/module/type1mod.c delete mode 100644 nx-X11/lib/font/Type1/objects.c delete mode 100644 nx-X11/lib/font/Type1/objects.h delete mode 100644 nx-X11/lib/font/Type1/paths.c delete mode 100644 nx-X11/lib/font/Type1/paths.h delete mode 100644 nx-X11/lib/font/Type1/pictures.h delete mode 100644 nx-X11/lib/font/Type1/range.h delete mode 100644 nx-X11/lib/font/Type1/regions.c delete mode 100644 nx-X11/lib/font/Type1/regions.h delete mode 100644 nx-X11/lib/font/Type1/scanfont.c delete mode 100644 nx-X11/lib/font/Type1/spaces.c delete mode 100644 nx-X11/lib/font/Type1/spaces.h delete mode 100644 nx-X11/lib/font/Type1/strokes.h delete mode 100644 nx-X11/lib/font/Type1/t1funcs.c delete mode 100644 nx-X11/lib/font/Type1/t1hdigit.h delete mode 100644 nx-X11/lib/font/Type1/t1imager.h delete mode 100644 nx-X11/lib/font/Type1/t1info.c delete mode 100644 nx-X11/lib/font/Type1/t1intf.h delete mode 100644 nx-X11/lib/font/Type1/t1io.c delete mode 100644 nx-X11/lib/font/Type1/t1malloc.c delete mode 100644 nx-X11/lib/font/Type1/t1snap.c delete mode 100644 nx-X11/lib/font/Type1/t1stdio.h delete mode 100644 nx-X11/lib/font/Type1/t1stub.c delete mode 100644 nx-X11/lib/font/Type1/t1test.c delete mode 100644 nx-X11/lib/font/Type1/t1unicode.c delete mode 100644 nx-X11/lib/font/Type1/t1unicode.h delete mode 100644 nx-X11/lib/font/Type1/token.c delete mode 100644 nx-X11/lib/font/Type1/token.h delete mode 100644 nx-X11/lib/font/Type1/tokst.h delete mode 100644 nx-X11/lib/font/Type1/trig.h delete mode 100644 nx-X11/lib/font/Type1/type1.c delete mode 100644 nx-X11/lib/font/Type1/util.c delete mode 100644 nx-X11/lib/font/Type1/util.h (limited to 'nx-X11/lib/font/Type1') diff --git a/nx-X11/lib/font/Type1/AFM.h b/nx-X11/lib/font/Type1/AFM.h deleted file mode 100644 index f2c997a3f..000000000 --- a/nx-X11/lib/font/Type1/AFM.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#if XFONT_CID -#ifndef AFM_H -#define AFM_H - -/* Bounding box definition. Used for the Font BBox as well as the - * Character BBox. - */ -typedef struct -{ - int llx; /* lower left x-position */ - int lly; /* lower left y-position */ - int urx; /* upper right x-position */ - int ury; /* upper right y-position */ -} BBox; - -/* Character Metric Information. This structure is used only if ALL - * character metric information is requested. If only the character - * widths is requested, then only an array of the character x-widths - * is returned. - * - * The key that each field is associated with is in comments. For an - * explanation about each key and its value please refer to the - * Character Metrics section of the AFM documentation (full title - * & version given above). - */ -typedef struct -{ - long code; /* CID code */ - int wx; /* key: WX or W0X */ - BBox charBBox; /* key: B */ -} Metrics; - -typedef struct -{ - int nChars; /* number of entries in char metrics array */ - Metrics *metrics; /* ptr to char metrics array */ -} FontInfo; - -int CIDAFM(FILE *, FontInfo **); -#endif /* AFM_H */ -#endif diff --git a/nx-X11/lib/font/Type1/Imakefile b/nx-X11/lib/font/Type1/Imakefile deleted file mode 100644 index 3b10c0399..000000000 --- a/nx-X11/lib/font/Type1/Imakefile +++ /dev/null @@ -1,91 +0,0 @@ -XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:46:28 cpqbld Exp $ - - - - -XCOMM $XFree86: xc/lib/font/Type1/Imakefile,v 1.12 2002/02/13 21:32:48 dawes Exp $ - -#if BuildServer && DoLoadableServer -#define IHaveSubdirs -#define NoLibSubdirs -#define PassCDebugFlags -SUBDIRS = module -#endif - -INCLUDES = -I$(FONTINCSRC) -I../include -I$(XINCLUDESRC) \ - -I$(SERVERSRC)/include - -#if BuildCID -CIDSRCS = cidchar.c afm.c -CIDOBJS = cidchar.o afm.o -#if HasUsableFileMmap -MMAPDEFINES = -DUSE_MMAP -#endif -DEFINES = -DBUILDCID -DHAVE_CFM $(MMAPDEFINES) -#endif - -SRCS = \ - arith.c \ - curves.c \ - fontfcn.c \ - hints.c \ - lines.c \ - objects.c \ - paths.c \ - regions.c \ - scanfont.c \ - spaces.c \ - t1funcs.c \ - t1info.c \ - t1io.c \ - t1malloc.c \ - t1snap.c \ - t1stub.c \ - token.c \ - type1.c \ - util.c \ - $(CIDSRCS) \ - t1unicode.c - - -OBJS = \ - arith.o \ - curves.o \ - fontfcn.o \ - hints.o \ - lines.o \ - objects.o \ - paths.o \ - regions.o \ - scanfont.o \ - spaces.o \ - t1funcs.o \ - t1info.o \ - t1io.o \ - t1malloc.o \ - t1snap.o \ - t1stub.o \ - token.o \ - type1.o \ - util.o \ - $(CIDOBJS) \ - t1unicode.o - -#if BuildFontLib -#define DoNormalLib NormalLibFont -#define DoSharedLib SharedLibFont -#define DoDebugLib DebugLibFont -#define DoProfileLib ProfileLibFont -#include -LibraryObjectRule() - -SubdirLibraryRule($(OBJS)) -NormalLintTarget($(SRCS)) -#endif - -#if BuildServer && DoLoadableServer -MakeSubdirs($(SUBDIRS)) -DependSubdirs($(SUBDIRS)) -#endif - -DependTarget() diff --git a/nx-X11/lib/font/Type1/afm.c b/nx-X11/lib/font/Type1/afm.c deleted file mode 100644 index 9a6dafee7..000000000 --- a/nx-X11/lib/font/Type1/afm.c +++ /dev/null @@ -1,200 +0,0 @@ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/afm.c,v 1.2 1999/08/21 13:47:38 dawes Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifdef XFONT_CID -#ifndef FONTMODULE -#include -#include -#include -#include -#else -#include "Xmd.h" /* For INT32 declaration */ -#include "Xdefs.h" /* For Bool */ -#include "xf86_ansic.h" -#endif -#include /* for xalloc/xfree */ -#include "AFM.h" - -#define PBUF 256 -#define KBUF 20 - -char *gettoken(FILE *); - -static char *afmbuf = NULL; - -char *gettoken(FILE *fd) { - char *bp; - int c, found; - - bp = afmbuf; - found = 0; - - while((c = getc(fd)) != EOF) { - if (found == 0 && (c == ' ' || c == '\t' || c == '\n' || c == '\r' || - c == ';' || c == ',')) continue; - found = 1; - if (c != ' ' && c != '\t' && c != '\n' && c != '\r' && c != ';') { - *bp++ = c; - if (bp - afmbuf >= PBUF) { - bp = afmbuf; - break; - } - } else - break; - } - - *bp = 0; - return(afmbuf); -} - -int CIDAFM(FILE *fd, FontInfo **pfi) { - char *p = 0; - int i, j, k = 0, found = 0; - FontInfo *fi; - - if (fd == NULL || pfi == NULL) return(1); - - *pfi = NULL; - - if ((afmbuf = (char *)xalloc(PBUF)) == NULL) - return(1); - - while(1) { - if (!(p = gettoken(fd))) { - xfree(afmbuf); - return(1); - } - - if (strncmp(p, "StartFontMetrics", 16) == 0) { - if (!(p = gettoken(fd))) { - xfree(afmbuf); - return(1); - } - if (strncmp(p, "4", 1) < 0) { - free(afmbuf); - return(1); - } - found = 1; - } else if (strncmp(p, "StartCharMetrics", 16) == 0) { - if (!found) { - xfree(afmbuf); - return(1); - } - - if (!(p = gettoken(fd))) { - xfree(afmbuf); - return(1); - } - - fi = (FontInfo *)xalloc(sizeof(FontInfo)); - - if (fi == NULL) { - xfree(afmbuf); - return(1); - } - bzero(fi, sizeof(FontInfo)); - - fi->nChars = atoi(p); - - if (fi->nChars < 0 || fi->nChars > INT_MAX / sizeof(Metrics)) { - xfree(afmbuf); - xfree(fi); - return(1); - } - fi->metrics = (Metrics *)xalloc(fi->nChars * - sizeof(Metrics)); - if (fi->metrics == NULL) { - xfree(afmbuf); - xfree(fi); - return(1); - } - - j = 0; - for (i = 0; i < fi->nChars; i++) { - k = 0; - while(1) { - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - if (strncmp(p, "W0X", 3) == 0) { - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].wx = atoi(p); - } else if (strncmp(p, "N", 1) == 0) { - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].code = (long)atoi(p); - } else if (strncmp(p, "B", 1) == 0) { - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].charBBox.llx = atoi(p); - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].charBBox.lly = atoi(p); - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].charBBox.urx = atoi(p); - if (!(p = gettoken(fd))) { - k = KBUF; - break; - } - fi->metrics[j].charBBox.ury = atoi(p); - j++; - break; - } - k++; - if (k >= KBUF) break; - } - if (k >= KBUF) break; - } - if (k >= KBUF || j != fi->nChars) { - xfree(fi->metrics); - xfree(fi); - xfree(afmbuf); - return(1); - } else { - *pfi = fi; - xfree(afmbuf); - return(0); - } - } - } - - xfree(afmbuf); - return(1); -} -#endif diff --git a/nx-X11/lib/font/Type1/arith.c b/nx-X11/lib/font/Type1/arith.c deleted file mode 100644 index 961154335..000000000 --- a/nx-X11/lib/font/Type1/arith.c +++ /dev/null @@ -1,486 +0,0 @@ -/* $Xorg: arith.c,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/arith.c,v 1.6tsi Exp $ */ - - /* ARITH CWEB V0006 ******** */ -/* -:h1.ARITH Module - Portable Module for Multiple Precision Fixed Point Arithmetic - -This module provides division and multiplication of 64-bit fixed point -numbers. (To be more precise, the module works on numbers that take -two 'longs' to store. That is almost always equivalent to saying 64-bit -numbers.) - -Note: it is frequently easy and desirable to recode these functions in -assembly language for the particular processor being used, because -assembly language, unlike C, will have 64-bit multiply products and -64-bit dividends. This module is offered as a portable version. - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Sten F. Andler - - -:h3.Include Files - -The included files are: -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -# include "os.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "arith.h" - - -/* -:h3. -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -Reference for all algorithms: Donald E. Knuth, "The Art of Computer -Programming, Volume 2, Semi-Numerical Algorithms," Addison-Wesley Co., -Massachusetts, 1969, pp. 229-279. - -Knuth talks about a 'digit' being an arbitrary sized unit and a number -being a sequence of digits. We'll take a digit to be a 'short'. -The following assumption must be valid for these algorithms to work: -:ol. -:li.A 'long' is two 'short's. -:eol. -The following code is INDEPENDENT of: -:ol. -:li.The actual size of a short. -:li.Whether shorts and longs are stored most significant byte -first or least significant byte first. -:eol. - -SHORTSIZE is the number of bits in a short; LONGSIZE is the number of -bits in a long; MAXSHORT is the maximum unsigned short: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -ASSEMBLE concatenates two shorts to form a long: -*/ -#define ASSEMBLE(hi,lo) ((((unsigned long)hi)<>SHORTSIZE) -#define LOWDIGIT(u) ((u)&MAXSHORT) - -/* -SIGNBITON tests the high order bit of a long 'w': -*/ -#define SIGNBITON(w) (((long)w)<0) - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h2.Double Long Arithmetic - -:h3.DLmult() - Multiply Two Longs to Yield a Double Long - -The two multiplicands must be positive. -*/ - -void -DLmult(doublelong *product, unsigned long u, unsigned long v) -{ -#ifdef LONG64 -/* printf("DLmult(? ?, %lx, %lx)\n", u, v); */ - *product = u*v; -/* printf("DLmult returns %lx\n", *product); */ -#else - register unsigned long u1, u2; /* the digits of u */ - register unsigned long v1, v2; /* the digits of v */ - register unsigned int w1, w2, w3, w4; /* the digits of w */ - register unsigned long t; /* temporary variable */ -/* printf("DLmult(? ?, %x, %x)\n", u, v); */ - u1 = HIGHDIGIT(u); - u2 = LOWDIGIT(u); - v1 = HIGHDIGIT(v); - v2 = LOWDIGIT(v); - - if (v2 == 0) w4 = w3 = w2 = 0; - else - { - t = u2 * v2; - w4 = LOWDIGIT(t); - t = u1 * v2 + HIGHDIGIT(t); - w3 = LOWDIGIT(t); - w2 = HIGHDIGIT(t); - } - - if (v1 == 0) w1 = 0; - else - { - t = u2 * v1 + w3; - w3 = LOWDIGIT(t); - t = u1 * v1 + w2 + HIGHDIGIT(t); - w2 = LOWDIGIT(t); - w1 = HIGHDIGIT(t); - } - - product->high = ASSEMBLE(w1, w2); - product->low = ASSEMBLE(w3, w4); -#endif /* LONG64 else */ -} - -/* -:h2.DLdiv() - Divide Two Longs by One Long, Yielding Two Longs - -Both the dividend and the divisor must be positive. -*/ - -void -DLdiv(doublelong *quotient, /* also where dividend is, originally */ - unsigned long divisor) -{ -#ifdef LONG64 -/* printf("DLdiv(%lx %lx)\n", quotient, divisor); */ - *quotient /= divisor; -/* printf("DLdiv returns %lx\n", *quotient); */ -#else - register unsigned long u1u2 = quotient->high; - register unsigned long u3u4 = quotient->low; - register long u3; /* single digit of dividend */ - register int v1,v2; /* divisor in registers */ - register long t; /* signed copy of u1u2 */ - register int qhat; /* guess at the quotient digit */ - register unsigned long q3q4; /* low two digits of quotient */ - register int shift; /* holds the shift value for normalizing */ - register int j; /* loop variable */ - -/* printf("DLdiv(%x %x, %x)\n", quotient->high, quotient->low, divisor); */ - /* - * Knuth's algorithm works if the dividend is smaller than the - * divisor. We can get to that state quickly: - */ - if (u1u2 >= divisor) { - quotient->high = u1u2 / divisor; - u1u2 %= divisor; - } - else - quotient->high = 0; - - if (divisor <= MAXSHORT) { - - /* - * This is the case where the divisor is contained in one - * 'short'. It is worthwhile making this fast: - */ - u1u2 = ASSEMBLE(u1u2, HIGHDIGIT(u3u4)); - q3q4 = u1u2 / divisor; - u1u2 %= divisor; - u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3u4)); - quotient->low = ASSEMBLE(q3q4, u1u2 / divisor); - return; - } - - - /* - * At this point the divisor is a true 'long' so we must use - * Knuth's algorithm. - * - * Step D1: Normalize divisor and dividend (this makes our 'qhat' - * guesses more accurate): - */ - for (shift=0; !SIGNBITON(divisor); shift++, divisor <<= 1) { ; } - shift--; - divisor >>= 1; - - if ((u1u2 >> (LONGSIZE - shift)) != 0 && shift != 0) - Abort("DLdiv: dividend too large"); - u1u2 = (u1u2 << shift) + ((shift == 0) ? 0 : u3u4 >> (LONGSIZE - shift)); - u3u4 <<= shift; - - /* - * Step D2: Begin Loop through digits, dividing u1,u2,u3 by v1,v2, - * then shifting U left by 1 digit: - */ - v1 = HIGHDIGIT(divisor); - v2 = LOWDIGIT(divisor); - q3q4 = 0; - u3 = HIGHDIGIT(u3u4); - - for (j=0; j < 2; j++) { - - /* - * Step D3: make a guess (qhat) at the next quotient denominator: - */ - qhat = (HIGHDIGIT(u1u2) == v1) ? MAXSHORT : u1u2 / v1; - /* - * At this point Knuth would have us further refine our - * guess, since we know qhat is too big if - * - * v2 * qhat > ASSEMBLE(u1u2 % v, u3) - * - * That would make sense if u1u2 % v was easy to find, as it - * would be in assembly language. I ignore this step, and - * repeat step D6 if qhat is too big. - */ - - /* - * Step D4: Multiply v1,v2 times qhat and subtract it from - * u1,u2,u3: - */ - u3 -= qhat * v2; - /* - * The high digit of u3 now contains the "borrow" for the - * rest of the substraction from u1,u2. - * Sometimes we can lose the sign bit with the above. - * If so, we have to force the high digit negative: - */ - t = HIGHDIGIT(u3); - if (t > 0) - t |= -1 << SHORTSIZE; - t += u1u2 - qhat * v1; -/* printf("..>divide step qhat=%x t=%x u3=%x u1u2=%x v1=%x v2=%x\n", - qhat, t, u3, u1u2, v1, v2); */ - while (t < 0) { /* Test is Step D5. */ - - /* - * D6: Oops, qhat was too big. Add back in v1,v2 and - * decrease qhat by 1: - */ - u3 = LOWDIGIT(u3) + v2; - t += HIGHDIGIT(u3) + v1; - qhat--; -/* printf("..>>qhat correction t=%x u3=%x qhat=%x\n", t, u3, qhat); */ - } - /* - * Step D7: shift U left one digit and loop: - */ - u1u2 = t; - if (HIGHDIGIT(u1u2) != 0) - Abort("divide algorithm error"); - u1u2 = ASSEMBLE(u1u2, LOWDIGIT(u3)); - u3 = LOWDIGIT(u3u4); - q3q4 = ASSEMBLE(q3q4, qhat); - } - quotient->low = q3q4; -/* printf("DLdiv returns %x %x\n", quotient->high, quotient->low); */ -#endif /* !LONG64 */ - return; -} - -/* -:h3.DLadd() - Add Two Double Longs - -In this case, the doublelongs may be signed. The algorithm takes the -piecewise sum of the high and low longs, with the possibility that the -high should be incremented if there is a carry out of the low. How to -tell if there is a carry? Alex Harbury suggested that if the sum of -the lows is less than the max of the lows, there must have been a -carry. Conversely, if there was a carry, the sum of the lows must be -less than the max of the lows. So, the test is "if and only if". -*/ - -void -DLadd(doublelong *u, /* u = u + v */ - doublelong *v) -{ -#ifdef LONG64 -/* printf("DLadd(%lx %lx)\n", *u, *v); */ - *u = *u + *v; -/* printf("DLadd returns %lx\n", *u); */ -#else - register unsigned long lowmax = MAX(u->low, v->low); - -/* printf("DLadd(%x %x, %x %x)\n", u->high, u->low, v->high, v->low); */ - u->high += v->high; - u->low += v->low; - if (lowmax > u->low) - u->high++; -#endif -} -/* -:h3.DLsub() - Subtract Two Double Longs - -Testing for a borrow is even easier. If the v.low is greater than -u.low, there must be a borrow. -*/ - -void -DLsub(doublelong *u, /* u = u - v */ - doublelong *v) -{ -#ifdef LONG64 -/* printf("DLsub(%lx %lx)\n", *u, *v); */ - *u = *u - *v; -/* printf("DLsub returns %lx\n", *u); */ -#else -/* printf("DLsub(%x %x, %x %x)\n", u->high, u->low, v->high, v->low);*/ - u->high -= v->high; - if (v->low > u->low) - u->high--; - u->low -= v->low; -#endif -} -/* -:h3.DLrightshift() - Macro to Shift Double Long Right by N -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h2.Fractional Pel Arithmetic -*/ -/* -:h3.FPmult() - Multiply Two Fractional Pel Values - -This funtion first calculates w = u * v to "doublelong" precision. -It then shifts w right by FRACTBITS bits, and checks that no -overflow will occur when the resulting value is passed back as -a fractpel. -*/ - -fractpel -FPmult(fractpel u, fractpel v) -{ - doublelong w; - register int negative = FALSE; /* sign flag */ -#ifdef LONG64 - register fractpel ret; -#endif - - if ((u == 0) || (v == 0)) return (0); - - - if (u < 0) {u = -u; negative = TRUE;} - if (v < 0) {v = -v; negative = !negative;} - - if (u == TOFRACTPEL(1)) return ((negative) ? -v : v); - if (v == TOFRACTPEL(1)) return ((negative) ? -u : u); - - DLmult(&w, u, v); - DLrightshift(w, FRACTBITS); -#ifndef LONG64 - if (w.high != 0 || SIGNBITON(w.low)) { - w.low = TOFRACTPEL(MAXSHORT); - } - - return ((negative) ? -w.low : w.low); -#else - if (w & 0xffffffff80000000L ) { - ret = TOFRACTPEL(MAXSHORT); - } - else - ret = (fractpel)w; - - return ((negative) ? -ret : ret); -#endif -} - -/* -:h3.FPdiv() - Divide Two Fractional Pel Values - -These values may be signed. The function returns the quotient. -*/ - -fractpel -FPdiv(fractpel dividend, fractpel divisor) -{ - doublelong w; /* result will be built here */ - int negative = FALSE; /* flag for sign bit */ -#ifdef LONG64 - register fractpel ret; -#endif - - if (dividend < 0) { - dividend = -dividend; - negative = TRUE; - } - if (divisor < 0) { - divisor = -divisor; - negative = !negative; - } -#ifndef LONG64 - w.low = dividend << FRACTBITS; - w.high = dividend >> (LONGSIZE - FRACTBITS); - DLdiv(&w, divisor); - if (w.high != 0 || SIGNBITON(w.low)) { - w.low = TOFRACTPEL(MAXSHORT); - } - return( (negative) ? -w.low : w.low); -#else - w = ((long)dividend) << FRACTBITS; - DLdiv(&w, divisor); - if (w & 0xffffffff80000000L ) { - ret = TOFRACTPEL(MAXSHORT); - } - else - ret = (fractpel)w; - return( (negative) ? -ret : ret); -#endif -} - -/* -:h3.FPstarslash() - Multiply then Divide - -Borrowing a chapter from the language Forth, it is useful to define -an operator that first multiplies by one constant then divides by -another, keeping the intermediate result in extended precision. -*/ - -fractpel -FPstarslash(fractpel a, /* result = a * b / c */ - fractpel b, - fractpel c) -{ - doublelong w; /* result will be built here */ - int negative = FALSE; -#ifdef LONG64 - register fractpel ret; -#endif - - if (a < 0) { a = -a; negative = TRUE; } - if (b < 0) { b = -b; negative = !negative; } - if (c < 0) { c = -c; negative = !negative; } - - DLmult(&w, a, b); - DLdiv(&w, c); -#ifndef LONG64 - if (w.high != 0 || SIGNBITON(w.low)) { - w.low = TOFRACTPEL(MAXSHORT); - } - return((negative) ? -w.low : w.low); -#else - if (w & 0xffffffff80000000L ) { - ret = TOFRACTPEL(MAXSHORT); - } - else - ret = (fractpel)w; - return( (negative) ? -ret : ret); -#endif -} diff --git a/nx-X11/lib/font/Type1/arith.h b/nx-X11/lib/font/Type1/arith.h deleted file mode 100644 index 6c810b946..000000000 --- a/nx-X11/lib/font/Type1/arith.h +++ /dev/null @@ -1,77 +0,0 @@ -/* $Xorg: arith.h,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/arith.h,v 1.4 1999/08/21 13:47:39 dawes Exp $ */ - -/*SHARED*/ - -#include /* LONG64 */ - -/*END SHARED*/ -/*SHARED*/ - -#undef SHORTSIZE -#define SHORTSIZE (sizeof(short)*8) -#undef LONGSIZE -#define LONGSIZE (SHORTSIZE*2) -#undef MAXSHORT -#define MAXSHORT ((1<>= (N)) -#else -#define DLrightshift(dl,N) { \ - dl.low = (dl.low >> N) + (((unsigned long) dl.high) << (LONGSIZE - N)); \ - dl.high >>= N; \ -} -#endif - -extern void DLmult ( doublelong *product, unsigned long u, unsigned long v ); -extern void DLdiv ( doublelong *quotient, unsigned long divisor ); -extern void DLadd ( doublelong *u, doublelong *v ); -extern void DLsub ( doublelong *u, doublelong *v ); -extern fractpel FPmult ( fractpel u, fractpel v ); -extern fractpel FPdiv ( fractpel dividend, fractpel divisor ); -extern fractpel FPstarslash ( fractpel a, fractpel b, fractpel c ); - -/*END SHARED*/ diff --git a/nx-X11/lib/font/Type1/blues.h b/nx-X11/lib/font/Type1/blues.h deleted file mode 100644 index 88602f79e..000000000 --- a/nx-X11/lib/font/Type1/blues.h +++ /dev/null @@ -1,95 +0,0 @@ -/* $Xorg: blues.h,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * Portions Copyright (c) 1990 Adobe Systems Incorporated. - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark or Adobe - * not be used in advertising or publicity pertaining to distribution of - * the software without specific, written prior permission. - * - * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY - * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE - * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING - * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY - * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, - * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND - * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE 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. - */ -/* $XFree86: xc/lib/font/Type1/blues.h,v 1.3 1999/08/22 08:58:49 dawes Exp $ */ - - -extern psobj *GetType1CharString ( psfont *fontP, unsigned char code ); - -#define TOPLEFT 1 -#define BOTTOMRIGHT 2 - -#define NUMBLUEVALUES 14 -#define NUMOTHERBLUES 10 -#define NUMFAMILYBLUES 14 -#define NUMFAMILYOTHERBLUES 10 -#define NUMSTEMSNAPH 12 -#define NUMSTEMSNAPV 12 -#define NUMSTDHW 1 -#define NUMSTDVW 1 - -#define DEFAULTBOLDSTEMWIDTH 2.0 - -#define MAXALIGNMENTZONES ((NUMBLUEVALUES+NUMOTHERBLUES)/2) -#define DEFAULTBLUESCALE 0.039625 -#define DEFAULTBLUESHIFT 7 -#define DEFAULTBLUEFUZZ 1 -#define DEFAULTSTDHW 0 -#define DEFAULTSTDVW 0 -#define DEFAULTFORCEBOLD FALSE -#define DEFAULTLANGUAGEGROUP 0 -#define DEFAULTRNDSTEMUP FALSE -#define DEFAULTLENIV 4 -#define DEFAULTEXPANSIONFACTOR 0.06 - -/* see Type 1 Font Format book for explanations of these values */ -/* Note that we're currently doing nothing for minfeature and password. */ -struct blues_struct { - struct blues_struct *next; /* ptr to next Blues structure in list */ - int numBlueValues; /* # of BlueValues in following array */ - int BlueValues[NUMBLUEVALUES]; - int numOtherBlues; /* # of OtherBlues values in following array */ - int OtherBlues[NUMOTHERBLUES]; - int numFamilyBlues; /* # of FamilyBlues values in following array */ - int FamilyBlues[NUMFAMILYBLUES]; - int numFamilyOtherBlues; /* # of FamilyOtherBlues values in */ - int FamilyOtherBlues[NUMFAMILYOTHERBLUES]; /* this array */ - double BlueScale; - int BlueShift; - int BlueFuzz; - double StdHW; - double StdVW; - int numStemSnapH; /* # of StemSnapH values in following array */ - double StemSnapH[NUMSTEMSNAPH]; - int numStemSnapV; /* # of StemSnapV values in following array */ - double StemSnapV[NUMSTEMSNAPV]; - int ForceBold; - int LanguageGroup; - int RndStemUp; - int lenIV; - double ExpansionFactor; -}; - -/* the alignment zone structure -- somewhat similar to the stem structure */ -/* see Adobe Type1 Font Format book about the terms used in this structure */ -struct alignmentzone { - int topzone; /* TRUE if a topzone, FALSE if a bottom zone */ - double bottomy, topy; /* interval of this alignment zone */ -}; diff --git a/nx-X11/lib/font/Type1/cidchar.c b/nx-X11/lib/font/Type1/cidchar.c deleted file mode 100644 index 20d26650c..000000000 --- a/nx-X11/lib/font/Type1/cidchar.c +++ /dev/null @@ -1,621 +0,0 @@ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/cidchar.c,v 1.9tsi Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#if XFONT_CID -#ifndef FONTMODULE -#include -#include -#include -#ifdef USE_MMAP -#include -#ifndef MAP_FAILED -#define MAP_FAILED ((caddr_t)(-1)) -#endif -#endif -#else -#include "Xmd.h" /* For INT32 declaration */ -#include "Xdefs.h" /* For Bool */ -#include "xf86_ansic.h" -#endif -#ifndef FONTMODULE -#ifdef _XOPEN_SOURCE -#include -#else -#define _XOPEN_SOURCE -#include -#undef _XOPEN_SOURCE -#endif -#endif -#include -#include "objects.h" -#include "spaces.h" -#include "range.h" -#include "util.h" -#include "fontfcn.h" -#include "blues.h" -#include "AFM.h" -#include "t1intf.h" - -#define BSIZE 4096 - -extern cidfont *CIDFontP; -extern psfont *FDArrayP; -extern psfont *FontP; - -static unsigned char sd[] = "StartData"; - -CharInfoPtr -CIDGetGlyphInfo(FontPtr pFont, unsigned int cidcode, CharInfoPtr pci, int *rc) -{ - CharInfoPtr cp = NULL; -#ifdef USE_MMAP - int fd; - unsigned char *buf; - long total_len = 0; -#else - FILE *fp; - unsigned char buf[BSIZE]; - unsigned int count = 0; -#endif - cidglyphs *cid; - unsigned char *p1 = NULL; -#ifndef USE_MMAP - unsigned char *p2; -#endif - register int i = 0, j; - long byteoffset; - int FDindex, FDBytes, GDBytes, SDBytes, SubrCount, CIDMapOffset, len; - psobj *arrayP; - psobj charstring; - long *subroffsets = NULL, cstringoffset, nextcstringoffset; - struct blues_struct *blues; - - cid = (cidglyphs *)pFont->fontPrivate; - -#ifdef USE_MMAP - if (!cid->CIDdata) { - if (!(fd = open(cid->CIDFontName, O_RDONLY, 0))) { - *rc = BadFontName; - return(cp); - } - cid->CIDsize = lseek(fd, 0, SEEK_END); - cid->CIDdata = (unsigned char *) - mmap(0, (size_t)cid->CIDsize, PROT_READ, MAP_SHARED, fd, 0); - close(fd); - if (cid->CIDdata == (unsigned char *)MAP_FAILED) { - *rc = AllocError; - cid->CIDdata = NULL; - return (cp); - } - } -#else - if (!(fp = fopen(cid->CIDFontName,"rb"))) { - *rc = BadFontName; - return(cp); - } -#endif - -#ifdef USE_MMAP - if (cid->dataoffset == 0) { - if ((p1 = (unsigned char *)strstr((char *)cid->CIDdata, (char *)sd)) - != NULL) { - cid->dataoffset = (p1 - cid->CIDdata) + strlen((char *)sd); - } - else { - *rc = BadFontFormat; - return(cp); - } - } -#else /* USE_MMAP */ - if (cid->dataoffset == 0) { - p2 = sd; - - /* find "StartData" */ - while (*p2) { - cid->dataoffset += count; - if ((count = fread(buf, 1, BSIZE, fp)) == 0) - break; - p1 = buf; - for (i=0; i < count && *p2; i++) { - if (*p1 == *p2) - p2++; - else { - p2 = sd; - if (*p1 == *p2) - p2++; - } - p1++; - } - } - - /* if "StartData" not found, or end of file */ - if (*p2 || count == 0) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } - - if (i >= count) { - cid->dataoffset += count; - count = fread(buf, 1, BSIZE, fp); - p1 = buf; - } else { - cid->dataoffset += p1 - buf; - count = count - (p1 - buf); - } - } else { - if (fseek(fp, cid->dataoffset, SEEK_SET)) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } - if ((count = fread(buf, 1, BSIZE, fp)) == 0) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } - p1 = buf; - } - - /* if "StartData" not found, or "Binary" data and the next character */ - /* is not the space character (0x20) */ - - if (count == 0 || (CIDFontP->binarydata && (*p1 != ' '))) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } -#endif /* USE_MMAP */ - - FDBytes = CIDFontP->CIDfontInfoP[CIDFDBYTES].value.data.integer; - GDBytes = CIDFontP->CIDfontInfoP[CIDGDBYTES].value.data.integer; - CIDMapOffset = CIDFontP->CIDfontInfoP[CIDMAPOFFSET].value.data.integer; - byteoffset = cid->dataoffset + 1 + CIDMapOffset + - cidcode * (FDBytes + GDBytes); -#ifdef USE_MMAP - buf = &cid->CIDdata[byteoffset]; -#else - if (fseek(fp, byteoffset, SEEK_SET)) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } - if ((count = fread(buf, 1, BSIZE, fp)) < 2*(FDBytes + GDBytes)) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } -#endif - - /* if FDBytes is equal to 0, the CIDMap contains no FD indices, and the */ - /* FD index of 0 is assumed. */ - if (FDBytes == 0) - FDindex = 0; - else { - FDindex = 0; - for (i = 0; i < FDBytes; i++) - FDindex += (unsigned char)buf[i] << (8 * (FDBytes - 1 - i)); - } - - if (FDindex >= CIDFontP->CIDfontInfoP[CIDFDARRAY].value.len) { - *rc = BadFontFormat; -#ifndef USE_MMAP - fclose(fp); -#endif - return(cp); - } - - cstringoffset = 0; - for (i = 0; i < GDBytes; i++) - cstringoffset += (unsigned char)buf[FDBytes + i] << - (8 * (GDBytes - 1 - i)); - - nextcstringoffset = 0; - for (i = 0; i < GDBytes; i++) - nextcstringoffset += (unsigned char)buf[2*FDBytes + GDBytes + i] << - (8 * (GDBytes - 1 - i)); - - len = nextcstringoffset - cstringoffset; - - if (len <= 0) { /* empty interval, missing glyph */ - *rc = BadFontFormat; -#ifndef USE_MMAP - fclose(fp); -#endif - return(cp); - } - - FontP = &FDArrayP[FDindex]; - - charstring.type = OBJ_INTEGER; - charstring.len = len; - -#ifndef USE_MMAP - if (!(charstring.data.stringP = (unsigned char *)xalloc(len))) { - *rc = AllocError; - fclose(fp); - return(cp); - } -#endif - - byteoffset = cid->dataoffset + 1 + cstringoffset; - -#ifdef USE_MMAP - charstring.data.stringP = &cid->CIDdata[byteoffset]; -#else - if (fseek(fp, byteoffset, SEEK_SET)) { - *rc = BadFontFormat; - xfree(charstring.data.stringP); - fclose(fp); - return(cp); - } - - if ((count = fread(charstring.data.stringP, 1, len, fp)) != len) { - *rc = BadFontFormat; - xfree(charstring.data.stringP); - fclose(fp); - return(cp); - } -#endif - - if (FontP->Subrs.data.arrayP == NULL) { - /* get subroutine data */ - byteoffset = cid->dataoffset + 1 + - FDArrayP[FDindex].Private[CIDT1SUBMAPOFF].value.data.integer; - - SDBytes = FDArrayP[FDindex].Private[CIDT1SDBYTES].value.data.integer; - - SubrCount = FDArrayP[FDindex].Private[CIDT1SUBRCNT].value.data.integer; -#ifdef USE_MMAP - buf = &cid->CIDdata[byteoffset]; -#else - if (fseek(fp, byteoffset, SEEK_SET)) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } - - if ((count = fread(buf, 1, BSIZE, fp)) < SDBytes * (SubrCount + 1)) { - *rc = BadFontFormat; - fclose(fp); - return(cp); - } -#endif - - arrayP = (psobj *)vm_alloc(SubrCount*sizeof(psobj)); - if (!arrayP) { - *rc = AllocError; -#ifndef USE_MMAP - fclose(fp); -#endif - return(cp); - } - - if (!(subroffsets = (long *)xalloc((SubrCount + 1)*sizeof(long)))) { - *rc = AllocError; -#ifndef USE_MMAP - fclose(fp); -#endif - return(cp); - } - - for (i = 0; i <= SubrCount; i++) { - subroffsets[i] = 0; - for (j = 0; j < SDBytes; j++) - subroffsets[i] += (unsigned char)buf[i * SDBytes + j] << - (8 * (SDBytes - 1 - j)); - } - - byteoffset = cid->dataoffset + 1 + subroffsets[0]; - - /* get subroutine info */ -#ifndef USE_MMAP - if (fseek(fp, byteoffset, SEEK_SET)) { - *rc = BadFontFormat; - xfree(subroffsets); - fclose(fp); - return(cp); - } -#else - total_len = byteoffset; -#endif - for (i = 0; i < SubrCount; i++) { - len = subroffsets[i + 1] - subroffsets[i]; -#ifndef USE_MMAP - arrayP[i].data.valueP = vm_alloc(len); - if (!arrayP[i].data.valueP) { - *rc = AllocError; - xfree(subroffsets); - fclose(fp); - return(cp); - } -#endif - arrayP[i].len = len; -#ifdef USE_MMAP - arrayP[i].data.valueP = (char *)&cid->CIDdata[total_len]; - total_len += len; -#else - if ((count = fread(arrayP[i].data.valueP, 1, len, fp)) != len) { - *rc = BadFontFormat; - xfree(subroffsets); - fclose(fp); - return(cp); - } -#endif - } - - FontP->Subrs.len = SubrCount; - FontP->Subrs.data.arrayP = arrayP; - xfree(subroffsets); - } - - if (FontP->BluesP == NULL) { - blues = (struct blues_struct *) vm_alloc(sizeof(struct blues_struct)); - if (!blues) { - *rc = AllocError; -#ifndef USE_MMAP - xfree(subroffsets); - fclose(fp); -#endif - return(cp); - } - bzero(blues, sizeof(struct blues_struct)); - blues->numBlueValues = - FDArrayP[FDindex].Private[CIDT1BLUEVALUES].value.len; - for (i = 0; i < blues->numBlueValues; i++) - blues->BlueValues[i] = - FDArrayP[FDindex].Private[CIDT1BLUEVALUES].value.data.arrayP[i].data.integer; - blues->numOtherBlues = - FDArrayP[FDindex].Private[CIDT1OTHERBLUES].value.len; - for (i = 0; i < blues->numOtherBlues; i++) - blues->OtherBlues[i] = - FDArrayP[FDindex].Private[CIDT1OTHERBLUES].value.data.arrayP[i].data.integer; - blues->numFamilyBlues = - FDArrayP[FDindex].Private[CIDT1FAMBLUES].value.len; - for (i = 0; i < blues->numFamilyBlues; i++) - blues->FamilyBlues[i] = - FDArrayP[FDindex].Private[CIDT1FAMBLUES].value.data.arrayP[i].data.integer; - blues->numFamilyOtherBlues = - FDArrayP[FDindex].Private[CIDT1FAMOTHERBLUES].value.len; - for (i = 0; i < blues->numFamilyOtherBlues; i++) - blues->FamilyOtherBlues[i] = - FDArrayP[FDindex].Private[CIDT1FAMOTHERBLUES].value.data.arrayP[i].data.integer; - blues->BlueScale = FDArrayP[FDindex].Private[CIDT1BLUESCALE].value.data.real; - blues->BlueShift = FDArrayP[FDindex].Private[CIDT1BLUESHIFT].value.data.integer; - blues->BlueFuzz = FDArrayP[FDindex].Private[CIDT1BLUEFUZZ].value.data.integer; - blues->StdHW = (double)FDArrayP[FDindex].Private[CIDT1STDHW].value.data.arrayP[0].data.integer; - blues->StdVW = (double)FDArrayP[FDindex].Private[CIDT1STDVW].value.data.arrayP[0].data.integer; - - blues->numStemSnapH = - FDArrayP[FDindex].Private[CIDT1STEMSNAPH].value.len; - for (i = 0; i < blues->numStemSnapH; i++) - blues->StemSnapH[i] = - FDArrayP[FDindex].Private[CIDT1STEMSNAPH].value.data.arrayP[i].data.integer; - blues->numStemSnapV = - FDArrayP[FDindex].Private[CIDT1STEMSNAPV].value.len; - for (i = 0; i < blues->numStemSnapV; i++) - blues->StemSnapV[i] = - FDArrayP[FDindex].Private[CIDT1STEMSNAPV].value.data.arrayP[i].data.integer; - blues->ForceBold = - FDArrayP[FDindex].Private[CIDT1FORCEBOLD].value.data.boolean; - - blues->LanguageGroup = - FDArrayP[FDindex].Private[CIDT1LANGGROUP].value.data.integer; - - blues->RndStemUp = - FDArrayP[FDindex].Private[CIDT1RNDSTEMUP].value.data.boolean; - - blues->lenIV = - FDArrayP[FDindex].Private[CIDT1LENIV].value.data.integer; - - blues->ExpansionFactor = - FDArrayP[FDindex].Private[CIDT1EXPFACTOR].value.data.real; - - FontP->BluesP = blues; - } - - cp = CIDRenderGlyph(pFont, &charstring, &FontP->Subrs, FontP->BluesP, pci, rc); - -#ifndef USE_MMAP - xfree(charstring.data.stringP); - - fclose(fp); -#endif - return(cp); -} - -static int -node_compare(const void *node1, const void *node2) -{ - return (((Metrics *)node1)->code - ((Metrics *)node2)->code); -} - -static CharInfoRec * -CIDGetCharMetrics(FontPtr pFont, FontInfo *fi, unsigned int charcode, double sxmult) -{ - CharInfoPtr cp; - Metrics *p, node; - unsigned int cidcode; - - cidcode = node.code = getCID(pFont, charcode); - if ((cidcode < fi->nChars) && (cidcode == fi->metrics[cidcode].code)) - p = &fi->metrics[cidcode]; - else - p = (Metrics *)bsearch(&node, fi->metrics, fi->nChars, sizeof(Metrics), node_compare); - - if (!p) - p = &fi->metrics[0]; - - if (!(cp = (CharInfoRec *)Xalloc(sizeof(CharInfoRec)))) - return NULL; - bzero(cp, sizeof(CharInfoRec)); - - /* indicate that character bitmap is not defined */ - cp->bits = (char *)CID_BITMAP_UNDEFINED; - - - /* get metric data for this CID code from the CID AFM file */ - cp->metrics.leftSideBearing = - floor(p->charBBox.llx / sxmult + 0.5); - cp->metrics.rightSideBearing = - floor(p->charBBox.urx / sxmult + 0.5); - cp->metrics.characterWidth = floor(p->wx / sxmult + 0.5); - cp->metrics.ascent = floor(p->charBBox.ury / sxmult + 0.5); - cp->metrics.descent = -floor(p->charBBox.lly / sxmult + 0.5); - - cp->metrics.attributes = p->wx; - - return cp; -} - -int -CIDGetAFM(FontPtr pFont, unsigned long count, unsigned char *chars, FontEncoding charEncoding, unsigned long *glyphCount, CharInfoPtr *glyphs, char *cidafmfile) -{ - FILE *fp; - FontInfo *fi = NULL; - cidglyphs *cid; - CharInfoPtr *glyphsBase; - register unsigned int c; - - register CharInfoPtr pci; - CharInfoPtr pDefault; - unsigned int firstCol, code, char_row, char_col; - double sxmult; - - cid = (cidglyphs *)pFont->fontPrivate; - - if (cid->AFMinfo == NULL) { - if (!(fp = fopen(cidafmfile, "rb"))) - return(BadFontName); - - if (CIDAFM(fp, &fi) != 0) { - fprintf(stderr, - "There is something wrong with Adobe Font Metric file %s.\n", - cidafmfile); - fclose(fp); - return(BadFontName); - } - fclose(fp); - cid->AFMinfo = fi; - } - fi = cid->AFMinfo; - - firstCol = pFont->info.firstCol; - pDefault = cid->pDefault; - glyphsBase = glyphs; - - /* multiplier for computation of raw values */ - sxmult = hypot(cid->pixel_matrix[0], cid->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - if (sxmult == 0.0) return(0); - - switch (charEncoding) { - -#define EXIST(pci) \ - ((pci)->metrics.attributes || \ - (pci)->metrics.ascent != -(pci)->metrics.descent || \ - (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) - - case Linear8Bit: - case TwoD8Bit: - if (pFont->info.firstRow > 0) - break; - while (count--) { - c = (*chars++); - if (c >= firstCol && c <= pFont->info.lastCol) { - code = c - firstCol; - if (!(pci = (CharInfoRec *)cid->glyphs[code])) - pci = CIDGetCharMetrics(pFont, fi, c, sxmult); - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - case Linear16Bit: - while (count--) { - char_row = *chars++; - char_col = *chars++; - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code])) - pci = CIDGetCharMetrics(pFont, fi, c, sxmult); - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - - case TwoD16Bit: - while (count--) { - char_row = (*chars++); - char_col = (*chars++); - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code])) - pci = CIDGetCharMetrics(pFont, fi, c, sxmult); - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - } - *glyphCount = glyphs - glyphsBase; - -#undef EXIST - - return Successful; - -} -#endif diff --git a/nx-X11/lib/font/Type1/cluts.h b/nx-X11/lib/font/Type1/cluts.h deleted file mode 100644 index 67d930324..000000000 --- a/nx-X11/lib/font/Type1/cluts.h +++ /dev/null @@ -1,35 +0,0 @@ -/* $Xorg: cluts.h,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* STUB */ - -#define KillCLUT(T) -#define CopyCLUT(T) T -#define UniqueCLUT(T) - diff --git a/nx-X11/lib/font/Type1/curves.c b/nx-X11/lib/font/Type1/curves.c deleted file mode 100644 index 9d0c3f8cc..000000000 --- a/nx-X11/lib/font/Type1/curves.c +++ /dev/null @@ -1,228 +0,0 @@ -/* $Xorg: curves.c,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 */ -/* All Rights Reserved */ - -/* License to use, copy, modify, and distribute this software */ -/* and its documentation for any purpose and without fee is */ -/* hereby granted, provided that licensee provides a license to */ -/* IBM, Corp. to use, copy, modify, and distribute derivative */ -/* works and their documentation for any purpose and without */ -/* fee, 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 IBM not be used in advertising or publicity pertaining to */ -/* distribution of the software without specific, written prior */ -/* permission. */ - -/* IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES */ -/* OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT */ -/* LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, */ -/* FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF */ -/* THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND */ -/* PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT */ -/* OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF */ -/* THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES */ -/* THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN */ -/* NO EVENT SHALL IBM 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. */ -/* $XFree86: xc/lib/font/Type1/curves.c,v 1.7 2001/08/27 19:49:52 dawes Exp $ */ - -/* -:h1.CURVES Module - Stepping Beziers - -This module is responsible for "rasterizing" -third order curves. That is, it changes the high level curve -specification into a list of pels that that curve travels -through. - -:h3.Include Files - -Include files needed: -*/ -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -# include "os.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "curves.h" -#include "lines.h" -#include "arith.h" - - -/* -:h3.Functions Provided to Other Modules - -External entry points: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -Note that "stepping" and "flattening" are so similiar that they use the -same routine. When the "region" parameter is NULL, that is a flag that -we are flattening instead of stepping. -*/ -/* -:h2.Bezier Third Order Curves -*/ -/* -:h3.The "bezierinfo" Structure - -This structure is used to store information used when we subdivide -Bezier curves. -*/ - -struct bezierinfo { - struct region *region; /* the region being built or NULL */ - struct fractpoint last; /* not used yet; maybe could save some work */ - struct fractpoint origin; /* the origin of the bezier */ -} ; - -/* - Checking for termination of the subdivision process: - This is the stupidest test in the world, just check if the coordinatewise - distance from an end control point to the next control point is less than - one half pel. If so, we must be done. - This returns 1 if the subdivision is terminated and 0 if you still need - to subdivide. -*/ - -static int -BezierTerminationTest(fractpel xa, fractpel ya, - fractpel xb, fractpel yb, - fractpel xc, fractpel yc, - fractpel xd, fractpel yd) -{ - fractpel dmax; - dmax = ABS(xa - xb); - dmax = MAX(dmax,ABS(ya - yb)); - dmax = MAX(dmax,ABS(xd - xc)); - dmax = MAX(dmax,ABS(yd - yc)); - if(dmax > FPHALF) - return(0); /* not done yet */ - else - return(1); /* done */ -} - -/* -:h3.StepBezierRecurse() - The Recursive Logic in StepBezier() - -The recursion involves dividing the control polygon into two smaller -control polygons by finding the midpoints of the lines. This idea is -described in any graphics text book and its simplicity is what caused -Bezier to define his curves as he did. If the input region 'R' is NULL, -the result is a path that is the 'flattened' curve; otherwise StepBezier -returns nothing special. -*/ -static struct segment * -StepBezierRecurse(struct bezierinfo *I, /* Region under construction or NULL */ - fractpel xA, fractpel yA, /* A control point */ - fractpel xB, fractpel yB, /* B control point */ - fractpel xC, fractpel yC, /* C control point */ - fractpel xD, fractpel yD) /* D control point */ -{ - if (BezierTerminationTest(xA,yA,xB,yB,xC,yC,xD,yD)) - { - if (I->region == NULL) - return(PathSegment(LINETYPE, xD - xA, yD - yA)); - else - StepLine(I->region, I->origin.x + xA, I->origin.y + yA, - I->origin.x + xD, I->origin.y + yD); - } - else - { - fractpel xAB,yAB; - fractpel xBC,yBC; - fractpel xCD,yCD; - fractpel xABC,yABC; - fractpel xBCD,yBCD; - fractpel xABCD,yABCD; - - xAB = xA + xB; yAB = yA + yB; - xBC = xB + xC; yBC = yB + yC; - xCD = xC + xD; yCD = yC + yD; - - xABC = xAB + xBC; yABC = yAB + yBC; - xBCD = xBC + xCD; yBCD = yBC + yCD; - - xABCD = xABC + xBCD; yABCD = yABC + yBCD; - - xAB >>= 1; yAB >>= 1; - xBC >>= 1; yBC >>= 1; - xCD >>= 1; yCD >>= 1; - xABC >>= 2; yABC >>= 2; - xBCD >>= 2; yBCD >>= 2; - xABCD >>= 3; yABCD >>= 3; - - if (I->region == NULL) - { - return( Join( - StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD), - StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD) - ) - ); - } - else - { - StepBezierRecurse(I, xA, yA, xAB, yAB, xABC, yABC, xABCD, yABCD); - StepBezierRecurse(I, xABCD, yABCD, xBCD, yBCD, xCD, yCD, xD, yD); - } - } - return NULL; - /*NOTREACHED*/ -} - -/* -:h3.TOOBIG() - Macro to Test if a Coordinate is Too Big to Bezier SubDivide Normally - -Intermediate values in the Bezier subdivision are 8 times bigger than -the starting values. If this overflows, a 'long', we are in trouble: -*/ - -#undef BITS -#define BITS (sizeof(long)*8) -#define HIGHTEST(p) (((p)>>(BITS-4)) != 0) /* includes sign bit */ -#define TOOBIG(xy) ((xy < 0) ? HIGHTEST(-xy) : HIGHTEST(xy)) - -/* -:h3.StepBezier() - Produce Run Ends for a Bezier Curve - -This is the entry point called from outside the module. -*/ - -struct segment * -StepBezier(struct region *R, /* Region under construction or NULL */ - fractpel xA, fractpel yA, /* A control point */ - fractpel xB, fractpel yB, /* B control point */ - fractpel xC, fractpel yC, /* C control point */ - fractpel xD, fractpel yD) /* D control point */ -{ - struct bezierinfo Info; - - Info.region = R; - Info.origin.x = xA; - Info.origin.y = yA; - - xB -= xA; - xC -= xA; - xD -= xA; - yB -= yA; - yC -= yA; - yD -= yA; - - if ( TOOBIG(xB) || TOOBIG(yB) || TOOBIG(xC) || TOOBIG(yC) - || TOOBIG(xD) || TOOBIG(yD) ) - Abort("Beziers this big not yet supported"); - - return(StepBezierRecurse(&Info, - (fractpel) 0, (fractpel) 0, xB, yB, xC, yC, xD, yD)); -} - diff --git a/nx-X11/lib/font/Type1/curves.h b/nx-X11/lib/font/Type1/curves.h deleted file mode 100644 index ca54bad62..000000000 --- a/nx-X11/lib/font/Type1/curves.h +++ /dev/null @@ -1,44 +0,0 @@ -/* $Xorg: curves.h,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/curves.h,v 1.3 1999/08/22 08:58:50 dawes Exp $ */ - -/*SHARED*/ - -#define StepConic(R,xA,yA,xB,yB,xC,yC,r) t1_StepConic(R,xA,yA,xB,yB,xC,yC,r) -#define StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) t1_StepBezier(R,xA,yA,xB,yB,xC,yC,xD,yD) - -#define FlattenConic(xM,yM,xC,yC,r) t1_StepConic(NULL,(fractpel)0,(fractpel)0,xM,yM,xC,yC,r) -#define FlattenBezier(xB,yB,xC,yC,xD,yD) t1_StepBezier(NULL,(fractpel)0,(fractpel)0,xB,yB,xC,yC,xD,yD) - -#if 0 -struct segment *t1_StepConic(); -#endif -extern struct segment *t1_StepBezier ( struct region *R, fractpel xA, fractpel yA, fractpel xB, fractpel yB, fractpel xC, fractpel yC, fractpel xD, fractpel yD ); - -/*END SHARED*/ diff --git a/nx-X11/lib/font/Type1/digit.h b/nx-X11/lib/font/Type1/digit.h deleted file mode 100644 index c69380954..000000000 --- a/nx-X11/lib/font/Type1/digit.h +++ /dev/null @@ -1,64 +0,0 @@ -/* $Xorg: digit.h,v 1.3 2000/08/17 19:46:29 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* -------------------------------------- */ -/* --- MACHINE GENERATED, DO NOT EDIT --- */ -/* -------------------------------------- */ - -#ifndef DIGIT -#define DIGIT 1 - -/* - * Digit Value Table -- - * - * The entries in the Digit Value Table map character - * codes in the set {0-9,a-z,A-Z} to their numeric - * values as part of numbers of radix 2-36. - * - */ -unsigned char digit_value[256] = { -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, - 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, - 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF -}; - -#endif diff --git a/nx-X11/lib/font/Type1/fontfcn.c b/nx-X11/lib/font/Type1/fontfcn.c deleted file mode 100644 index 9b48b9834..000000000 --- a/nx-X11/lib/font/Type1/fontfcn.c +++ /dev/null @@ -1,709 +0,0 @@ -/* $Xorg: fontfcn.c,v 1.4 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ -/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/fontfcn.c,v 1.10 2001/04/05 17:42:27 dawes Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include -#include -#else -#include "Xmd.h" /* For INT32 declaration */ -#include "Xdefs.h" /* For Bool */ -#include "xf86_ansic.h" -#endif -#include "t1imager.h" -#include "util.h" -#if XFONT_CID -#include "range.h" -#include -#endif -#include -#include "fontfcn.h" - -extern struct segment *Type1Char ( char *env, XYspace S, - psobj *charstrP, psobj *subrsP, - psobj *osubrsP, - struct blues_struct *bluesP, int *modeP ); - -#if XFONT_CID -extern struct xobject *CIDChar ( char *env, XYspace S, - psobj *charstrP, psobj *subrsP, - psobj *osubrsP, - struct blues_struct *bluesP, int *modeP ); -static boolean initCIDFont( int cnt ); -#endif - -/***================================================================***/ -/* GLOBALS */ -/***================================================================***/ -char CurFontName[120]; -char *CurFontEnv; -char *vm_base = NULL; -psfont *FontP = NULL; -psfont TheCurrentFont; -#if XFONT_CID -char CurCIDFontName[CID_PATH_MAX]; -char CurCMapName[CID_PATH_MAX]; -cidfont *CIDFontP = NULL; -cmapres *CMapP = NULL; -cidfont TheCurrentCIDFont; -cmapres TheCurrentCMap; -psfont *FDArrayP = NULL; -int FDArrayIndex = 0; -#endif - -/***================================================================***/ -/* SearchDict - look for name */ -/* - compare for match on len and string */ -/* return 0 - not found. */ -/* return n - nth element in dictionary. */ -/***================================================================***/ -int -SearchDictName(psdict *dictP, psobj *keyP) -{ - int i,n; - - - n = dictP[0].key.len; - for (i=1;i<=n;i++) { /* scan the intire dictionary */ - if ( - (dictP[i].key.len == keyP->len ) - && - (strncmp(dictP[i].key.data.valueP, - keyP->data.valueP, - keyP->len) == 0 - ) - ) return(i); - } - return(0); -} - -#if XFONT_CID -static boolean -initCIDFont(int cnt) -{ - if (!(vm_init(cnt))) return(FALSE); - vm_base = vm_next_byte(); - strcpy(CurCIDFontName, ""); /* initialize to none */ - strcpy(CurCMapName, ""); /* initialize to none */ - /* cause a font data reset on the next Type 1 font */ - strcpy(CurFontName, ""); /* initialize to none */ - CIDFontP = &TheCurrentCIDFont; - CMapP = &TheCurrentCMap; - CIDFontP->vm_start = vm_next_byte(); - CIDFontP->spacerangecnt = 0; - CIDFontP->notdefrangecnt = 0; - CIDFontP->cidrangecnt = 0; - CIDFontP->spacerangeP = NULL; - CIDFontP->notdefrangeP = NULL; - CIDFontP->cidrangeP = NULL; - CIDFontP->CIDFontFileName.len = 0; - CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName; - CMapP->CMapFileName.len = 0; - CMapP->CMapFileName.data.valueP = CurCMapName; - CMapP->firstRow = 0xFFFF; - CMapP->firstCol = 0xFFFF; - CMapP->lastRow = 0; - CMapP->lastCol = 0; - return(TRUE); -} - -/***================================================================***/ -boolean -initCIDType1Font(void) -{ - strcpy(CurFontName, ""); /* initialize to none */ - FontP = &FDArrayP[FDArrayIndex]; - FontP->vm_start = vm_next_byte(); - FontP->FontFileName.len = 0; - FontP->FontFileName.data.valueP = CurFontName; - FontP->Subrs.len = 0; - FontP->Subrs.data.stringP = NULL; - FontP->CharStringsP = NULL; - FontP->Private = NULL; - FontP->fontInfoP = NULL; - FontP->BluesP = NULL; - return(TRUE); -} -#endif - -boolean -initFont(int cnt) -{ - - if (!(vm_init(cnt))) return(FALSE); - vm_base = vm_next_byte(); - if (!(Init_BuiltInEncoding())) return(FALSE); - strcpy(CurFontName, ""); /* iniitialize to none */ -#if XFONT_CID - /* cause a font data reset on the next CID-keyed font */ - strcpy(CurCIDFontName, ""); /* initialize to none */ -#endif - FontP = &TheCurrentFont; - FontP->vm_start = vm_next_byte(); - FontP->FontFileName.len = 0; - FontP->FontFileName.data.valueP = CurFontName; - return(TRUE); -} -/***================================================================***/ -#if XFONT_CID -static void -resetCIDFont(char *cidfontname, char *cmapfile) -{ - - vm_next = CIDFontP->vm_start; - vm_free = vm_size - ( vm_next - vm_base); - CIDFontP->spacerangecnt = 0; - CIDFontP->notdefrangecnt = 0; - CIDFontP->cidrangecnt = 0; - CIDFontP->spacerangeP = NULL; - CIDFontP->notdefrangeP = NULL; - CIDFontP->cidrangeP = NULL; - CIDFontP->CIDfontInfoP = NULL; - /* This will load the font into the FontP */ - strcpy(CurCIDFontName,cidfontname); - strcpy(CurCMapName,cmapfile); - CIDFontP->CIDFontFileName.len = strlen(CurCIDFontName); - CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName; - CMapP->CMapFileName.len = strlen(CurCMapName); - CMapP->CMapFileName.data.valueP = CurCMapName; - CMapP->firstRow = 0xFFFF; - CMapP->firstCol = 0xFFFF; - CMapP->lastRow = 0; - CMapP->lastCol = 0; -} - -static void -resetCIDType1Font(void) -{ - - vm_next = FontP->vm_start; - vm_free = vm_size - ( vm_next - vm_base); - FontP->Subrs.len = 0; - FontP->Subrs.data.stringP = NULL; - FontP->CharStringsP = NULL; - FontP->Private = NULL; - FontP->fontInfoP = NULL; - FontP->BluesP = NULL; - /* This will load the font into the FontP */ - FontP->FontFileName.len = strlen(CurFontName); - FontP->FontFileName.data.valueP = CurFontName; -} -#endif - -static void -resetFont(char *env) -{ - - vm_next = FontP->vm_start; - vm_free = vm_size - ( vm_next - vm_base); - FontP->Subrs.len = 0; - FontP->Subrs.data.stringP = NULL; - FontP->CharStringsP = NULL; - FontP->Private = NULL; - FontP->fontInfoP = NULL; - FontP->BluesP = NULL; - /* This will load the font into the FontP */ - strcpy(CurFontName,env); - FontP->FontFileName.len = strlen(CurFontName); - FontP->FontFileName.data.valueP = CurFontName; - -} - -#if XFONT_CID -/***================================================================***/ -int -readCIDFont(char *cidfontname, char *cmapfile) -{ - int rcode; - - /* restore the virtual memory and eliminate old font */ - resetCIDFont(cidfontname, cmapfile); - /* This will load the font into the FontP */ - rcode = scan_cidfont(CIDFontP, CMapP); - if (rcode == SCAN_OUT_OF_MEMORY) { - /* free the memory and start again */ - if (!(initCIDFont(vm_size * 2))) { - /* we are really out of memory */ - return(SCAN_OUT_OF_MEMORY); - } - resetCIDFont(cidfontname, cmapfile); - rcode = scan_cidfont(CIDFontP, CMapP); - /* only double the memory twice, then report error */ - if (rcode == SCAN_OUT_OF_MEMORY) { - /* free the memory and start again */ - if (!(initCIDFont(vm_size * 2))) { - /* we are really out of memory */ - return(SCAN_OUT_OF_MEMORY); - } - resetCIDFont(cidfontname, cmapfile); - rcode = scan_cidfont(CIDFontP, CMapP); - } - } - return(rcode); -} - -int -readCIDType1Font(void) -{ - int rcode; - - resetCIDType1Font(); - - /* This will load the font into the FontP */ - rcode = scan_cidtype1font(FontP); - return(rcode); -} -#endif - -int -readFont(char *env) -{ - int rcode; - - /* restore the virtual memory and eliminate old font */ - resetFont(env); - /* This will load the font into the FontP */ - rcode = scan_font(FontP); - if (rcode == SCAN_OUT_OF_MEMORY) { - /* free the memory and start again */ -#if XFONT_CID - /* xfree(vm_base); */ -#else - xfree(vm_base); -#endif - if (!(initFont(vm_size * 2))) { - /* we are really out of memory */ - return(SCAN_OUT_OF_MEMORY); - } - resetFont(env); - rcode = scan_font(FontP); -#if XFONT_CID - /* only double the memory twice, then report error */ - if (rcode == SCAN_OUT_OF_MEMORY) { - /* free the memory and start again */ - /* xfree(vm_base) */ - if (!(initFont(vm_size * 2))) { - /* we are really out of memory */ - return(SCAN_OUT_OF_MEMORY); - } - resetFont(env); - rcode = scan_font(FontP); - } -#else - /* only double the memory once, then report error */ -#endif - } - return(rcode); -} -/***================================================================***/ -struct xobject * -fontfcnB(struct XYspace *S, unsigned char *code, int *lenP, int *mode) -{ - psobj *charnameP; /* points to psobj that is name of character*/ - int N; - psdict *CharStringsDictP; /* dictionary with char strings */ - psobj CodeName; /* used to store the translation of the name*/ - psobj *SubrsArrayP; - psobj *theStringP; - - struct xobject *charpath; /* the path for this character */ - - charnameP = &CodeName; - charnameP->len = *lenP; - charnameP->data.stringP = code; - - CharStringsDictP = FontP->CharStringsP; - - /* search the chars string for this charname as key */ - N = SearchDictName(CharStringsDictP,charnameP); - if (N<=0) { - *mode = FF_PARSE_ERROR; - return(NULL); - } - /* ok, the nth item is the psobj that is the string for this char */ - theStringP = &(CharStringsDictP[N].value); - - /* get the dictionary pointers to the Subrs */ - - SubrsArrayP = &(FontP->Subrs); - /* scale the Adobe fonts to 1 unit high */ - /* call the type 1 routine to rasterize the character */ - charpath = (struct xobject *)Type1Char((char *)FontP,S,theStringP, - SubrsArrayP,NULL, - FontP->BluesP , mode); - /* if Type1Char reported an error, then return */ - if ( *mode == FF_PARSE_ERROR) return(NULL); - /* fill with winding rule unless path was requested */ - if (*mode != FF_PATH) { - charpath = (struct xobject *)Interior((struct segment *)charpath, - WINDINGRULE+CONTINUITY); - } - return(charpath); -} - -#if XFONT_CID -/***================================================================***/ -/* CIDfontfcnA(cidfontname, cmapfile, mode) */ -/* */ -/* 1) initialize the font - global indicates it has been done */ -/* 2) load the font */ -/***================================================================***/ -Bool -CIDfontfcnA(char *cidfontname, char *cmapfile, int *mode) -{ - int rcode, cidinit; - - cidinit = 0; - if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) { - InitImager(); - if (!(initCIDFont(VM_SIZE))) { - /* we are really out of memory */ - *mode = SCAN_OUT_OF_MEMORY; - return(FALSE); - } - cidinit = 1; - } - - /* if the cidfontname is null, then use font already loaded */ - - /* if not the same font name */ - if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) || - (cmapfile && strcmp(cmapfile,CurCMapName) != 0)) { - /* restore the virtual memory and eliminate old font, read new one */ - rcode = readCIDFont(cidfontname, cmapfile); - if (rcode != 0 ) { - strcpy(CurCIDFontName, ""); /* no CIDFont loaded */ - strcpy(CurCMapName, ""); /* no CMap loaded */ - *mode = rcode; - return(FALSE); - } - } - return(TRUE); - -} - -/***================================================================***/ -/* CIDType1fontfcnA(mode) */ -/* */ -/* 1) initialize the font - global indicates it has been done */ -/* 2) load the font */ -/***================================================================***/ -Bool -CIDType1fontfcnA(int *mode) -{ - int rcode; - - if (!(initCIDType1Font())) { - /* we are really out of memory */ - *mode = SCAN_OUT_OF_MEMORY; - return(FALSE); - } - - if ((rcode = readCIDType1Font()) != 0) { - strcpy(CurFontName, ""); /* no font loaded */ - *mode = rcode; - return(FALSE); - } - return(TRUE); - -} -#endif - -/***================================================================***/ -/* fontfcnA(env, mode) */ -/* */ -/* env is a pointer to a string that contains the fontname. */ -/* */ -/* 1) initialize the font - global indicates it has been done */ -/* 2) load the font */ -/***================================================================***/ -Bool -fontfcnA(char *env, int *mode) -{ - int rc; - - /* Has the FontP initialized? If not, then */ - /* Initialize */ -#if XFONT_CID - if (FontP == NULL || strcmp(CurFontName, "") == 0) { -#else - if (FontP == NULL) { -#endif - InitImager(); - if (!(initFont(VM_SIZE))) { - /* we are really out of memory */ - *mode = SCAN_OUT_OF_MEMORY; - return(FALSE); - } - } - - /* if the env is null, then use font already loaded */ - - /* if the not same font name */ - if ( (env) && (strcmp(env,CurFontName) != 0 ) ) { - /* restore the virtual memory and eliminate old font, read new one */ - rc = readFont(env); - if (rc != 0 ) { - strcpy(CurFontName, ""); /* no font loaded */ - *mode = rc; - return(FALSE); - } - } - return(TRUE); - -} - -#if XFONT_CID -/***================================================================***/ -/* CIDQueryFontLib(cidfontname,cmapfile,infoName,infoValue,rcodeP) */ -/* */ -/* cidfontname is a pointer to a string that contains the fontname. */ -/* */ -/* 1) initialize the font - global indicates it has been done */ -/* 2) load the font */ -/* 3) use the font to call getInfo for that value. */ -/***================================================================***/ - -void -CIDQueryFontLib(char *cidfontname, char *cmapfile, char *infoName, - pointer infoValue, /* parameter returned here */ - int *rcodeP) -{ - int rc,N,i,cidinit; - psdict *dictP; - psobj nameObj; - psobj *valueP; - - /* Has the CIDFontP initialized? If not, then */ - /* Initialize */ - cidinit = 0; - if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) { - InitImager(); - if (!(initCIDFont(VM_SIZE))) { - *rcodeP = 1; - return; - } - cidinit = 1; - } - /* if the file name is null, then use font already loaded */ - /* if the not same font name, reset and load next font */ - if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) || - (cmapfile && strcmp(cmapfile,CurCMapName) != 0)) { - /* restore the virtual memory and eliminate old font */ - rc = readCIDFont(cidfontname, cmapfile); - if (rc != 0 ) { - strcpy(CurCIDFontName, ""); /* no font loaded */ - strcpy(CurCMapName, ""); /* no font loaded */ - *rcodeP = 1; - return; - } - } - dictP = CIDFontP->CIDfontInfoP; - objFormatName(&nameObj,strlen(infoName),infoName); - N = SearchDictName(dictP,&nameObj); - /* if found */ - if ( N > 0 ) { - *rcodeP = 0; - switch (dictP[N].value.type) { - case OBJ_ARRAY: - valueP = dictP[N].value.data.arrayP; - /* Just double check valueP. H.J. */ - if (valueP == NULL) break; - if (strcmp(infoName,"FontMatrix") == 0) { - /* 6 elments, return them as floats */ - for (i=0;i<6;i++) { - if (valueP->type == OBJ_INTEGER ) - ((float *)infoValue)[i] = valueP->data.integer; - else - ((float *)infoValue)[i] = valueP->data.real; - valueP++; - } - } - if (strcmp(infoName,"FontBBox") == 0) { - /* 4 elments for Bounding Box. all integers */ - for (i=0;i<4;i++) { - ((int *)infoValue)[i] = valueP->data.integer; - valueP++; - } - break; - case OBJ_INTEGER: - case OBJ_BOOLEAN: - *((int *)infoValue) = dictP[N].value.data.integer; - break; - case OBJ_REAL: - *((float *)infoValue) = dictP[N].value.data.real; - break; - case OBJ_NAME: - case OBJ_STRING: - *((char **)infoValue) = dictP[N].value.data.valueP; - break; - default: - *rcodeP = 1; - break; - } - } - } - else *rcodeP = 1; -} -#endif - -/***================================================================***/ -/* QueryFontLib(env, infoName,infoValue,rcodeP) */ -/* */ -/* env is a pointer to a string that contains the fontname. */ -/* */ -/* 1) initialize the font - global indicates it has been done */ -/* 2) load the font */ -/* 3) use the font to call getInfo for that value. */ -/***================================================================***/ - -void -QueryFontLib(char *env, char *infoName, - pointer infoValue, /* parameter returned here */ - int *rcodeP) -{ - int rc,N,i; - psdict *dictP; - psobj nameObj; - psobj *valueP; - - /* Has the FontP initialized? If not, then */ - /* Initialize */ - if (FontP == NULL) { - InitImager(); - if (!(initFont(VM_SIZE))) { - *rcodeP = 1; - return; - } - } - /* if the env is null, then use font already loaded */ - /* if the not same font name, reset and load next font */ - if ( (env) && (strcmp(env,CurFontName) != 0 ) ) { - /* restore the virtual memory and eliminate old font */ - rc = readFont(env); - if (rc != 0 ) { - strcpy(CurFontName, ""); /* no font loaded */ - *rcodeP = 1; - return; - } - } - dictP = FontP->fontInfoP; - objFormatName(&nameObj,strlen(infoName),infoName); - N = SearchDictName(dictP,&nameObj); - /* if found */ - if ( N > 0 ) { - *rcodeP = 0; - switch (dictP[N].value.type) { - case OBJ_ARRAY: - valueP = dictP[N].value.data.arrayP; - /* Just double check valueP. H.J. */ - if (valueP == NULL) break; - if (strcmp(infoName,"FontMatrix") == 0) { - /* 6 elments, return them as floats */ - for (i=0;i<6;i++) { - if (valueP->type == OBJ_INTEGER ) - ((float *)infoValue)[i] = valueP->data.integer; - else - ((float *)infoValue)[i] = valueP->data.real; - valueP++; - } - } - if (strcmp(infoName,"FontBBox") == 0) { - /* 4 elments for Bounding Box. all integers */ - for (i=0;i<4;i++) { - ((int *)infoValue)[i] = valueP->data.integer; - valueP++; - } - break; - case OBJ_INTEGER: - case OBJ_BOOLEAN: - *((int *)infoValue) = dictP[N].value.data.integer; - break; - case OBJ_REAL: - *((float *)infoValue) = dictP[N].value.data.real; - break; - case OBJ_NAME: - case OBJ_STRING: - *((char **)infoValue) = dictP[N].value.data.valueP; - break; - default: - *rcodeP = 1; - break; - } - } - } - else *rcodeP = 1; -} - -#if XFONT_CID -struct xobject * -CIDfontfcnC(struct XYspace *S, psobj *theStringP, - psobj *SubrsArrayP, struct blues_struct *BluesP, - int *lenP, int *mode) -{ - struct xobject *charpath; /* the path for this character */ - - charpath = (struct xobject *)CIDChar((char *)FontP,S,theStringP, - SubrsArrayP,NULL,BluesP,mode); - /* if Type1Char reported an error, then return */ - if ( *mode == FF_PARSE_ERROR) return(NULL); - /* fill with winding rule unless path was requested */ - if (*mode != FF_PATH) { - charpath = (struct xobject *)Interior((struct segment *)charpath, - WINDINGRULE+CONTINUITY); - } - return(charpath); -} -#endif diff --git a/nx-X11/lib/font/Type1/fontfcn.h b/nx-X11/lib/font/Type1/fontfcn.h deleted file mode 100644 index 1409eb9a9..000000000 --- a/nx-X11/lib/font/Type1/fontfcn.h +++ /dev/null @@ -1,250 +0,0 @@ -/* $Xorg: fontfcn.h,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/fontfcn.h,v 1.4 1999/08/22 08:58:50 dawes Exp $ */ - - -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -/* modular config.h defines VERSION as libXfont version */ -#ifdef VERSION -#undef VERSION -#endif - -#if XFONT_CID -/* Definition of a PostScript CIDFont resource */ -typedef struct cid_font { - char *vm_start; - int spacerangecnt; - int notdefrangecnt; - int cidrangecnt; - spacerange *spacerangeP; - cidrange *notdefrangeP; - cidrange *cidrangeP; - int binarydata; /* 1=binary data, 0=hex data */ - long bytecnt; - psobj CIDFontFileName; - psdict *CIDfontInfoP; -} cidfont; - -/* Definition of a PostScript CMap resource */ -typedef struct cmap_res { - unsigned short firstCol; - unsigned short lastCol; - unsigned short firstRow; - unsigned short lastRow; - psobj CMapFileName; - psdict *CMapInfoP; -} cmapres; -#endif - -/* Definition of a PostScript FONT */ -typedef struct ps_font { - char *vm_start; - psobj FontFileName; - psobj Subrs; - psdict *CharStringsP; - psdict *Private; - psdict *fontInfoP; -struct blues_struct *BluesP; -} psfont; -/***================================================================***/ -/* Routines in scan_font */ -/***================================================================***/ - -extern boolean Init_BuiltInEncoding ( void ); -#if XFONT_CID -extern int scan_cidfont ( cidfont *CIDFontP, cmapres *CMapP ); -extern int scan_cidtype1font ( psfont *FontP ); -#endif -extern int scan_font ( psfont *FontP ); -/***================================================================***/ -/* Return codes from scan_font */ -/***================================================================***/ -#define SCAN_OK 0 -#define SCAN_FILE_EOF -1 -#define SCAN_ERROR -2 -#define SCAN_OUT_OF_MEMORY -3 -#define SCAN_FILE_OPEN_ERROR -4 -#define SCAN_TRUE -5 -#define SCAN_FALSE -6 -#define SCAN_END -7 - -#if XFONT_CID -/***================================================================***/ -/* Name of CID FontInfo fields */ -/***================================================================***/ -#define CIDCOUNT 1 -#define CIDFONTNAME 2 -#define CIDFONTTYPE 3 -#define CIDVERSION 4 -#define CIDREGISTRY 5 -#define CIDORDERING 6 -#define CIDSUPPLEMENT 7 -#define CIDMAPOFFSET 8 -#define CIDFDARRAY 9 -#define CIDFDBYTES 10 -#define CIDFONTBBOX 11 -#define CIDFULLNAME 12 -#define CIDFAMILYNAME 13 -#define CIDWEIGHT 14 -#define CIDNOTICE 15 -#define CIDGDBYTES 16 -#define CIDUIDBASE 17 -#define CIDXUID 18 - -/***================================================================***/ -/* Name of CMapInfo fields */ -/***================================================================***/ -#define CMAPREGISTRY 1 -#define CMAPORDERING 2 -#define CMAPSUPPLEMENT 3 -#define CMAPNAME 4 -#define CMAPVERSION 5 -#define CMAPTYPE 6 -#define CMAPWMODE 7 -#define CMAPCIDCOUNT 8 -#endif - -/***================================================================***/ -/* Name of FontInfo fields */ -/***================================================================***/ - -#define FONTNAME 1 -#define PAINTTYPE 2 -#define FONTTYPENUM 3 -#define FONTMATRIX 4 -#define FONTBBOX 5 -#define UNIQUEID 6 -#define STROKEWIDTH 7 -#define VERSION 8 -#define NOTICE 9 -#define FULLNAME 10 -#define FAMILYNAME 11 -#define WEIGHT 12 -#define ITALICANGLE 13 -#define ISFIXEDPITCH 14 -#define UNDERLINEPOSITION 15 -#define UNDERLINETHICKNESS 16 -#define ENCODING 17 -/***================================================================***/ -/* Name of Private values */ -/***================================================================***/ -#define BLUEVALUES 1 -#define OTHERBLUES 2 -#define FAMILYBLUES 3 -#define FAMILYOTHERBLUES 4 -#define BLUESCALE 5 -#define BLUESHIFT 6 -#define BLUEFUZZ 7 -#define STDHW 8 -#define STDVW 9 -#define STEMSNAPH 10 -#define STEMSNAPV 11 -#define FORCEBOLD 12 -#define LANGUAGEGROUP 13 -#define LENIV 14 -#define RNDSTEMUP 15 -#define EXPANSIONFACTOR 16 - -#if XFONT_CID -/***================================================================***/ -/* Name of CID Type 1 Private values */ -/***================================================================***/ -#define CIDT1MINFEATURE 1 -#define CIDT1LENIV 2 -#define CIDT1LANGGROUP 3 -#define CIDT1BLUEVALUES 4 -#define CIDT1OTHERBLUES 5 -#define CIDT1BLUESCALE 6 -#define CIDT1BLUEFUZZ 7 -#define CIDT1BLUESHIFT 8 -#define CIDT1FAMBLUES 9 -#define CIDT1FAMOTHERBLUES 10 -#define CIDT1STDHW 11 -#define CIDT1STDVW 12 -#define CIDT1STEMSNAPH 13 -#define CIDT1STEMSNAPV 14 -#define CIDT1SUBMAPOFF 15 -#define CIDT1SDBYTES 16 -#define CIDT1SUBRCNT 17 -#define CIDT1FORCEBOLD 18 -#define CIDT1RNDSTEMUP 19 -#define CIDT1EXPFACTOR 20 - -#define CID_BITMAP_UNDEFINED 0 -extern int SearchDictName ( psdict *dictP, psobj *keyP ); -#if XFONT_CID -extern boolean initCIDType1Font ( void ); -#endif -extern boolean initFont ( int cnt ); -#if XFONT_CID -extern int readCIDFont ( char *cidfontname, char *cmapfile ); -extern int readCIDType1Font ( void ); -#endif -extern int readFont ( char *env ); -extern struct xobject *fontfcnB ( struct XYspace *S, unsigned char *code, - int *lenP, int *mode ); -#if XFONT_CID -extern Bool CIDfontfcnA ( char *cidfontname, char *cmapfile, int *mode ); -extern Bool CIDType1fontfcnA ( int *mode ); -#endif -extern Bool fontfcnA ( char *env, int *mode ); -#if XFONT_CID -extern void CIDQueryFontLib ( char *cidfontname, char *cmapfile, - char *infoName, pointer infoValue, int *rcodeP ); -#endif -extern void QueryFontLib ( char *env, char *infoName, pointer infoValue, - int *rcodeP ); -#if XFONT_CID -extern struct xobject *CIDfontfcnC ( struct XYspace *S, psobj *theStringP, - psobj *SubrsArrayP, - struct blues_struct *BluesP, int *lenP, - int *mode ); -#endif -#endif diff --git a/nx-X11/lib/font/Type1/fonts.h b/nx-X11/lib/font/Type1/fonts.h deleted file mode 100644 index 7215e0f7a..000000000 --- a/nx-X11/lib/font/Type1/fonts.h +++ /dev/null @@ -1,49 +0,0 @@ -/* $Xorg: fonts.h,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ - -/* STUB */ - -#define CopyFont(f) f -#define UniqueFont(f) f -#define KillFont(f) -#define KillText(t) -#define CopyText(t) t -#define I_DumpText(t) -#define CoerceText(t) t -#define TextDelta(t,pt) -#define XformText(p,s) -#define GimeSpace() FALSE - -#define LibInit() -#define InitFonts() -#define InitFiles() -#define TraceClose() - -#define FF_PARSE_ERROR -1 diff --git a/nx-X11/lib/font/Type1/hdigit.h b/nx-X11/lib/font/Type1/hdigit.h deleted file mode 100644 index fbaa9c1db..000000000 --- a/nx-X11/lib/font/Type1/hdigit.h +++ /dev/null @@ -1,94 +0,0 @@ -/* $Xorg: hdigit.h,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* -------------------------------------- */ -/* --- MACHINE GENERATED, DO NOT EDIT --- */ -/* -------------------------------------- */ - -#ifndef HDIGIT -#define HDIGIT 1 - -/* - * Hex Digit Value Table -- - * - * The entries in the Digit Value Table map character codes in the set - * {0-9,a-f,A-F} to their numeric values for readhexstring - * (00 10...F0 for the high hex digit and 00 01...0F for the low). - * The white-space and hex string termination characters are. - * mapped to codes > 0xf0 to enable usage by several modules. - * 2 tables are build HighHex and LowHex. - * - */ - -/* Indicators for special characters in these tables */ -#define HERROR (0xfe) -#define HWHITE_SPACE (0xfd) -#define HRIGHT_ANGLE (0xfc) -#define LAST_HDIGIT (0xf0) - -#define HighHexP (HighHex+1) -unsigned char HighHex[257] = { 0xFF, - 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, - 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE -}; -#define LowHexP (LowHex+1) -unsigned char LowHex[257] = { 0xFF, - 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFE,0xFE,0xFE,0xFE,0xFC,0xFE, - 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, - 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE -}; - -#endif diff --git a/nx-X11/lib/font/Type1/hints.c b/nx-X11/lib/font/Type1/hints.c deleted file mode 100644 index 14deac229..000000000 --- a/nx-X11/lib/font/Type1/hints.c +++ /dev/null @@ -1,890 +0,0 @@ -/* $Xorg: hints.c,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/hints.c,v 1.7tsi Exp $ */ - - /* HINTS CWEB V0006 ******** */ -/* -:h1.HINTS Module - Processing Rasterization Hints - -&author. Sten F. Andler; continuity by Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) and Duaine -W. Pryor, Jr. - - -:h3.Include Files - -The included files are: -*/ -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -# include "os.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "hints.h" - -/* -:h3.Functions Provided to the TYPE1IMAGER User - -None. -*/ - -/* -:h3.Functions Provided to Other Modules - -This module provides the following entry point to other modules: -*/ - - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.Macros Provided to Other Modules - -None. -*/ - -/* -:h2.InitHints() - Initialize hint data structure -*/ - -#define MAXLABEL 20 -static struct { - int inuse; - int computed; - struct fractpoint hint; -} oldHint[MAXLABEL]; - -#define ODD(x) (((int)(x)) & 01) -#define FPFLOOR(fp) TOFRACTPEL((fp) >> FRACTBITS) -#define FPROUND(fp) FPFLOOR((fp) + FPHALF) - -void -InitHints(void) -{ - int i; - - for (i = 0; i < MAXLABEL; i++) - { - oldHint[i].inuse = FALSE; - oldHint[i].computed = FALSE; - } -} - -/* -:h3.CloseHints(hintP) - Reverse hints that are still open -*/ - -void -CloseHints(struct fractpoint *hintP) -{ - int i; - - for (i = 0; i < MAXLABEL; i++) - { - if (oldHint[i].inuse) - { - hintP->x -= oldHint[i].hint.x; - hintP->y -= oldHint[i].hint.y; - - oldHint[i].inuse = FALSE; - } - } -} - -/* -:h3.ComputeHint(hP, currX, currY, hintP) - Compute the value of a hint -*/ - -static void -ComputeHint(struct hintsegment *hP, - fractpel currX, fractpel currY, - struct fractpoint *hintP) -{ - fractpel currRef, currWidth; - int idealWidth; - fractpel hintValue; - char orientation; - -/* -By construction, width is never zero. Therefore we can use the -width value to determine if the hint has been rotated by a -multiple of 90 degrees. -*/ - - if (hP->width.y == 0) - { - orientation = 'v'; /* vertical */ - } - else if (hP->width.x == 0) - { - orientation = 'h'; /* horizontal */ - } - else - { - hintP->x = hintP->y = 0; - return; - } - - /* Compute currRef and currWidth with a unit of 1 pel */ - if (orientation == 'v') /* vertical */ - { - currRef = hP->ref.x + currX; - currWidth = ABS(hP->width.x); - } - else if (orientation == 'h') /* horizontal */ - { - currRef = hP->ref.y + currY; - currWidth = ABS(hP->width.y); - } - else /* error */ - { - Abort("ComputeHint: invalid orientation"); - } - - if ((hP->hinttype == 'b') /* Bar or stem */ - || (hP->hinttype == 's')) /* Serif */ - { - idealWidth = NEARESTPEL(currWidth); - if (idealWidth == 0) idealWidth = 1; - if (ODD(idealWidth)) /* Is ideal width odd? */ - { - /* center "ref" over pel */ - hintValue = FPFLOOR(currRef) + FPHALF - currRef; - } - else - { - /* align "ref" on pel boundary */ - hintValue = FPROUND(currRef) - currRef; - } - } - else if (hP->hinttype == 'c') /* Curve extrema */ - { - /* align "ref" on pel boundary */ - hintValue = FPROUND(currRef) - currRef; - } - else /* error */ - { - Abort("ComputeHint: invalid hinttype"); - } - - if (orientation == 'v') /* vertical */ - { - hintP->x = hintValue; - hintP->y = 0; - } - else if (orientation == 'h') /* horizontal */ - { - hintP->x = 0; - hintP->y = hintValue; - } - else /* error */ - { - Abort("ComputeHint: invalid orientation"); - } -} - -/* -:h3.ProcessHint(hP, currX, currY, hintP) - Process a rasterization hint -*/ - -void -ProcessHint(struct hintsegment *hP, - fractpel currX, fractpel currY, - struct fractpoint *hintP) -{ - struct fractpoint thisHint; - - if ((hP->adjusttype == 'm') /* Move */ - || (hP->adjusttype == 'a')) /* Adjust */ - { - /* Look up hint in oldHint table */ - if ((hP->label >= 0) && (hP->label < MAXLABEL)) - { - if (oldHint[hP->label].computed) - /* Use old hint value if already computed */ - { - thisHint.x = oldHint[hP->label].hint.x; - thisHint.y = oldHint[hP->label].hint.y; - oldHint[hP->label].inuse = TRUE; - } - else - /* Compute new value for hint and store it for future use */ - { - ComputeHint(hP, currX, currY, &thisHint); - - oldHint[hP->label].hint.x = thisHint.x; - oldHint[hP->label].hint.y = thisHint.y; - oldHint[hP->label].inuse = TRUE; - oldHint[hP->label].computed = TRUE; - } - } - else /* error */ - { - Abort("ProcessHint: invalid label"); - } - } - else if (hP->adjusttype == 'r') /* Reverse */ - { - /* Use the inverse of the existing hint value to reverse hint */ - if ((hP->label >= 0) && (hP->label < MAXLABEL)) - { - if (oldHint[hP->label].inuse) - { - thisHint.x = -oldHint[hP->label].hint.x; - thisHint.y = -oldHint[hP->label].hint.y; - oldHint[hP->label].inuse = FALSE; - } - else /* error */ - { - Abort("ProcessHint: label is not in use"); - } - } - else /* error */ - { - Abort("ProcessHint: invalid label"); - } - - } - else /* error */ - { - Abort("ProcessHint: invalid adjusttype"); - } - - hintP->x += thisHint.x; - hintP->y += thisHint.y; -} - -/* -:h2 id=subpath.Navigation Through Edge Lists - -For continuity checking purposes, we need to navigate through edge -lists by the "subpath" chains and answer questions about edges. The -subpath chain links together edges that were part of the same subpath -(no intervening move segments) when the interior of the path was -calculated. Here we use the term "edge" to mean every edge list -that was created in between changes of direction. - -The subpath chains are singly-linked circular chains. For the convenience -of building them, they direction of the list (from edge to edge) is the -reverse of the order in which they were built. Within any single edge, -the subpath chain goes from top-to-bottom. (There might be a violation -of this because of the way the user started the first chain; see -:hdref refid=fixsubp..). - -:h3.ISTOP() and ISBOTTOM() - Flag Bits for Edge Lists at the Top and -Bottom of Their SubPaths -*/ - -#define ISTOP(flag) ((flag)&0x20) -#define ISBOTTOM(flag) ((flag)&0x10) -/* -:h3.ISLEFT() - Flag Bit for Left Edges -*/ - -#define ISLEFT(flag) ((flag)&0x08) - -/* -:h3.XofY() - Macro to Find X Value at Given Y - -This macro can only be used if it is known that the Y is within the -given edgelist's ymin and ymax. -*/ - -#define XofY(edge, y) edge->xvalues[y - edge->ymin] - -/* -:h3.findXofY() - Like XofY(), Except not Restricted - -If the Y is out of bounds of the given edgelist, this macro will -call SearchXofY to search the edge's subpath chain for the correct -Y range. If the Y value is off the edge, MINPEL is returned. -*/ -#define findXofY(edge, y) ((y < edge->ymin || y >= edge->ymax) ? SearchXofY(edge, y) : XofY(edge, y)) - -/* -:h4.SearchXofY() - Routine Called by FindXofY() for Difficult Cases - -The concept of this routine is to follow the subpath chain to find the -edge just below (i.e., next in chain) or just above (i.e., immediately -before in chain. It is assumed that the Y value is no more than one -off of the edge's range; XofY() could be replace by FindXofY() to -call ourselves recursively if this were not true. -*/ - -static pel -SearchXofY(register struct edgelist *edge, /* represents edge */ - register pel y) /* 'y' value to find edge for */ -{ - register struct edgelist *e; /* loop variable */ - - if (y < edge->ymin) { - if (ISTOP(edge->flag)) - return(MINPEL); - for (e = edge->subpath; e->subpath != edge; e = e->subpath) { ; } - if (e->ymax == edge->ymin) - return(XofY(e, y)); - } - else if (y >= edge->ymax) { - if (ISBOTTOM(edge->flag)) - return(MINPEL); - e = edge->subpath; - if (e->ymin == edge->ymax) - return(XofY(e, y)); - } - else - return(XofY(edge, y)); - - Abort("bad subpath chain"); - /*NOTREACHED*/ -} -/* -:h3.ISBREAK() Macro - Tests if an Edge List is at a "Break" - -The subpath chains are organized top to bottom. When the bottom of -a given edge is reached, the subpath chain points to the top of the -next edge. We call this a "break" in the chain. The following macro -is the simple test for the break condition: -*/ - -#define ISBREAK(top,bot) (top->ymax != bot->ymin) - - -/* -:h3.ImpliedHorizontalLine() - Tests for Horizontal Connectivity - -This function returns true if two edges are connected horizontally. -They are connected horizontally if they are consecutive in the subpath, -and either we are at the bottom and the first edge is going down or we -are at the top and the first edge is going up. -*/ - -#define BLACKABOVE -1 -#define BLACKBELOW +1 -#define NONE 0 - -static int -ImpliedHorizontalLine(struct edgelist *e1, /* two edges to check */ - struct edgelist *e2, - int y) /* y where they might be connected */ -{ - register struct edgelist *e3,*e4; - - if (ISDOWN(e1->flag) == ISDOWN(e2->flag)) - return(NONE); /* can't be consecutive unless different directions */ -/* -Now we check for consecutiveness: Can we get from 'e1' to 'e2' with -only one intervening break? Can we get from 'e2' to 'e1' with only one -intervening break? 'e3' will be as far as we can get after 'e1'; 'e4' -will be has far as we can get after 'e2': -*/ - for (e3 = e1; !ISBREAK(e3, e3->subpath); e3 = e3->subpath) { ; } - for (e3 = e3->subpath; e3 != e2; e3 = e3->subpath) - if (ISBREAK(e3, e3->subpath)) - break; - - for (e4 = e2; !ISBREAK(e4, e4->subpath); e4 = e4->subpath) { ; } - for (e4 = e4->subpath; e4 != e1; e4 = e4->subpath) - if (ISBREAK(e4, e4->subpath)) - break; -/* -If the edges are mutually consecutive, we must have horizontal lines -both top and bottom: -*/ - if (e3 == e2 && e4 == e1) - return(TRUE); -/* -If the edges are not consecutive either way, no horizontal lines are -possible: -*/ - if (e3 != e2 && e4 != e1) - return(NONE); -/* -Now let's swap 'e1' and 'e2' if necessary to enforce the rule that 'e2' -follows 'e1'. Remember that subpath chains go in the opposite direction -from the way the subpaths were built; this led to the simplest way -do build them. -*/ - if (e4 != e1) { - e2 = e1; - e1 = e3; /* remember e3 == e2, this just swaps 'e1' and 'e2' */ - } -/* -Now we have everything to return the answer: -*/ - if (ISTOP(e1->flag) && y == e1->ymin) - return(ISDOWN(e2->flag)); - else if (ISBOTTOM(e1->flag) && y == e1->ymax) - return(!ISDOWN(e2->flag)); - else - Abort("ImpliedHorizontalLine: why ask?"); - /*NOTREACHED*/ -} - -/* -:h3 id=fixsubp.FixSubPaths() - Must be Called to Organize Subpath Chains - -The region-building code in Interior(), in particular splitedge(), -maintains the rule that sub-paths are linked top-to-bottom except -at breaks. However, it is possible that there may be a "false break" -because the user started the subpath in the middle of an edge (and -went in the "wrong" direction from there, up instead of down). This -routine finds and fixes false breaks. - -Also, this routine sets the ISTOP and ISBOTTOM flags in the edge lists. -*/ - -static void -FixSubPaths(struct region *R) /* anchor of region */ -{ - register struct edgelist *e; /* fast loop variable */ - register struct edgelist *edge; /* current edge in region */ - register struct edgelist *next; /* next in subpath after 'edge' */ - register struct edgelist *break1; /* first break after 'next' */ - register struct edgelist *break2 = NULL; /* last break before 'edge' */ - register struct edgelist *prev; /* previous edge for fixing links */ - int left = TRUE; - - for (edge = R->anchor; edge != NULL; edge = edge->link) { - - if (left) - edge->flag |= ISLEFT(ON); - left = !left; - - next = edge->subpath; - - if (!ISBREAK(edge, next)) - continue; - if (edge->ymax < next->ymin) - Abort("disjoint subpath?"); -/* -'edge' now contains an edgelist at the bottom of an edge, and 'next' -contains the next subsequent edgelist in the subpath, which must be at -the top. We refer to this a "break" in the subpath. -*/ - next->flag |= ISTOP(ON); - edge->flag |= ISBOTTOM(ON); - - if (ISDOWN(edge->flag) != ISDOWN(next->flag)) - continue; -/* -We are now in the unusual case; both edges are going in the same -direction so this must be a "false break" due to the way that the user -created the path. We'll have to fix it. -*/ - for (break1 = next; !ISBREAK(break1, break1->subpath); break1 = break1->subpath) { ; } - - for (e = break1->subpath; e != edge; e = e->subpath) - if (ISBREAK(e, e->subpath)) - break2 = e; -/* -Now we've set up 'break1' and 'break2'. I've found the following -diagram invaluable. 'break1' is the first break after 'next'. 'break2' -is the LAST break before 'edge'. -&drawing. - next - +------+ +---->+------+ - +--->| >-----+ | | >-----+ - | | | | | | | | - | +-------------+ | +-------------+ - | | |break1| | | | | - | +->| >-------+ +->| >-----+ - | | | | | | - | | | +-------------+ - | +------+ | | | - | +----------------+ | | | - | | +------+ | +->| >-----+ - | +->| >-----+ | | | | - | | | | | +-------------+ - | +-------------+ | | | | - | | |edge | | | |break2| - | +->| >-----+ | +->| >-----+ - | | | | | | | | - | | | | | | | | - | | | | | | | | - | +------+ | | +------+ | - | | | | - +---------------+ +---------------+ - -&edrawing. -We want to fix this situation by having 'edge' point to where 'break1' -now points, and having 'break1' point to where 'break2' now points. -Finally, 'break2' should point to 'next'. Also, we observe that -'break1' can't be a bottom, and is also not a top unless it is the same -as 'next': -*/ - edge->subpath = break1->subpath; - - break1->subpath = break2->subpath; - if (ISBREAK(break1, break1->subpath)) - Abort("unable to fix subpath break?"); - - break2->subpath = next; - - break1->flag &= ~ISBOTTOM(ON); - if (break1 != next) - break1->flag &= ~ISTOP(ON); - } -/* -This region might contain "ambiguous" edges; edges exactly equal to -edge->link. Due to the random dynamics of where they get sorted into -the list, they can yield false crossings, where the edges appear -to cross. This confuses our continuity logic no end. Since we can -swap them without changing the region, we do. -*/ - for (edge = R->anchor, prev = NULL; VALIDEDGE(edge); prev = edge, edge = prev->link) { - - if (! ISAMBIGUOUS(edge->flag)) - continue; - - next = edge->subpath; - - while (ISAMBIGUOUS(next->flag) && next != edge) - next = next->subpath; -/* -We've finally found a non-ambiguous edge; we make sure it is left/right -compatible with 'edge': -*/ - if ( (ISLEFT(edge->flag) == ISLEFT(next->flag) && ISDOWN(edge->flag) == ISDOWN(next->flag) ) - || (ISLEFT(edge->flag) != ISLEFT(next->flag) && ISDOWN(edge->flag) != ISDOWN(next->flag) ) ) - continue; - -/* -Incompatible, we will swap 'edge' and the following edge in the list. -You may think that there must be a next edge in this swath. So did I. -No! If there is a totally ambiguous inner loop, for example, we could -get all the way to the outside without resolving ambiguity. -*/ - next = edge->link; /* note new meaning of 'next' */ - if (next == NULL || edge->ymin != next->ymin) - continue; - if (prev == NULL) - R->anchor = next; - else - prev->link = next; - edge->link = next->link; - next->link = edge; - edge->flag ^= ISLEFT(ON); - edge->flag &= ~ISAMBIGUOUS(ON); - next->flag ^= ISLEFT(ON); - next->flag &= ~ISAMBIGUOUS(ON); - edge = next; - } -} -/* -:h3.DumpSubPaths() - -A debug tool. -*/ - -static struct edgelist *before(struct edgelist *e); /* subroutine of DumpSubPaths */ - -static void -DumpSubPaths(struct edgelist *anchor) -{ - - register struct edgelist *edge,*e,*e2; - pel y; - - for (edge = anchor; VALIDEDGE(edge); edge = edge->link) { - if (ISPERMANENT(edge->flag)) - continue; - for (e2 = edge; !ISPERMANENT(e2->flag);) { - if (ISDOWN(e2->flag)) { - for (e = e2;; e = e->subpath) { - for (y=e->ymin+1; y < e->ymax; y++) - e->flag |= ISPERMANENT(ON); - if (ISBREAK(e, e->subpath)) - break; - } - } - else { - for (e = e2; !ISBREAK(e, e->subpath); e = e->subpath) { ; } - for (;; e=before(e)) { - for (y=e->ymax-2; y >= e->ymin; y--) - e->flag |= ISPERMANENT(ON); - if (e == e2) - break; - } - } - do { - e2 = before(e2); - } while (!ISBREAK(before(e2), e2)); - } - } -} - -static struct edgelist * -before(struct edgelist *e) -{ - struct edgelist *r; - for (r = e->subpath; r->subpath != e; r = r->subpath) { ; } - return(r); -} - -/* -:h2.Fixing Region Continuity Problems - -Small regions may become disconnected when their connecting segments are -less than a pel wide. This may be correct in some applications, but in -many (especially small font characters), it is more pleasing to keep -connectivity. ApplyContinuity() (invoked by +CONTINUITY on the -Interior() fill rule) fixes connection breaks. The resulting region -is geometrically less accurate, but may be more pleasing to the eye. -*/ -/* -Here are some macros which we will need: -*/ - -#define IsValidPel(j) (j!=MINPEL) - -/* -:h3.writeXofY() - Stuffs an X Value Into an "edgelist" - -writeXofY writes an x value into an edge at position 'y'. It must -update the edge's xmin and xmax. If there is a possibility that this -new x might exceed the region's bounds, updating those are the -responsibility of the caller. -*/ - -static void -writeXofY(struct edgelist *e,/* relevant edgelist */ - int y, /* y value */ - int x) /* new x value */ -{ - if (e->xmin > x) e->xmin = x; - if (e->xmax < x) e->xmax = x; - e->xvalues[y - e->ymin] = x; -} - -/*-------------------------------------------------------------------------*/ -/* the following three macros tell us whether we are at a birth point, a */ -/* death point, or simply in the middle of the character */ -/*-------------------------------------------------------------------------*/ -#define WeAreAtTop(e,i) (ISTOP(e->flag) && e->ymin == i) -#define WeAreAtBottom(e,i) (ISBOTTOM(e->flag) && e->ymax-1 == i) -#define WeAreInMiddle(e,i) \ - ((!ISTOP(e->flag) && !ISBOTTOM(e->flag))||(i < e->ymax-1 && i > e->ymin)) -/* -The following macro tests if two "edgelist" structures are in the same -swath: -*/ -#define SAMESWATH(e1,e2) (e1->ymin == e2->ymin) - -/* -:h3.CollapseWhiteRun() - Subroutine of ApplyContinuity() - -When we have a white run with an implied horizontal line above or -below it, we better have black on the other side of this line. This -function both tests to see if black is there, and adjusts the end -points (collapses) the white run as necessary if it is not. The -goal is to collapse the white run as little as possible. -*/ - -static void -CollapseWhiteRun(struct edgelist *anchor, /* anchor of edge list */ - pel yblack, /* y of (hopefully) black run above or below */ - struct edgelist *left, /* edgelist at left of WHITE run */ - struct edgelist *right, /* edgelist at right of WHITE run */ - pel ywhite) /* y location of white run */ -{ - struct edgelist *edge; - struct edgelist *swathstart = anchor; - register pel x; - - if (XofY(left, ywhite) >= XofY(right, ywhite)) - return; -/* -Find the swath with 'yblack'. If we don't find it, completely collapse -the white run and return: -*/ - while (VALIDEDGE(swathstart)) { - if (yblack < swathstart->ymin) { - writeXofY(left, ywhite, XofY(right, ywhite)); - return; - } - if (yblack < swathstart->ymax) break; - swathstart = swathstart->link->link; - } - if(!VALIDEDGE(swathstart)) { - writeXofY(left, ywhite, XofY(right, ywhite)); - return; - } -/* -Now we are in the swath that contains 'y', the reference line above -or below that we are trying to maintain continuity with. If black -in this line begins in the middle of our white run, we must collapse -the white run from the left to that point. If black ends in the -middle of our white run, we must collapse the white run from the right -to that point. -*/ - for (edge = swathstart; VALIDEDGE(edge); edge = edge->link) { - - if (!SAMESWATH(swathstart,edge)) - break; - if( XofY(edge, yblack) > XofY(left, ywhite)) { - if (ISLEFT(edge->flag)) { - x = XofY(edge, yblack); - if (XofY(right, ywhite) < x) - x = XofY(right, ywhite); - writeXofY(left, ywhite, x); - } - else { - x = XofY(edge, yblack); - while (edge->link != NULL && SAMESWATH(edge, edge->link) - && x >= XofY(edge->link, yblack) ) { - edge = edge->link->link; - x = XofY(edge, yblack); - } - if (x < XofY(right, ywhite)) - writeXofY(right, ywhite, x); - return; - } - } - } - writeXofY(left, ywhite, XofY(right, ywhite)); -} - -/* -:h3.ApplyContinuity() - Fix False Breaks in a Region - -This is the externally visible routine called from the REGIONS module -when the +CONTINUITY flag is on the Interior() fill rule. -*/ - -void -ApplyContinuity(struct region *R) -{ - struct edgelist *left; - struct edgelist *right; - struct edgelist *edge,*e2; - pel rightXabove,rightXbelow,leftXabove,leftXbelow; - pel leftX,rightX; - int i; - long newcenter,abovecenter,belowcenter; - - FixSubPaths(R); - if (RegionDebug >= 3) - DumpSubPaths(R->anchor); - left = R->anchor; -/* loop through and do all of the easy checking. ( no tops or bottoms) */ - while(VALIDEDGE(left)) - { - right = left->link; - for(i=left->ymin;iymax;++i) - { - leftX = findXofY(left,i); - rightX = findXofY(right,i); - leftXbelow = findXofY(left,i+1); - rightXbelow = findXofY(right,i+1); - if(rightX <= leftX) - { -/* then, we have a break in a near vertical line */ - leftXabove = findXofY(left,i-1); - rightXabove = findXofY(right,i-1); - if( IsValidPel(leftXabove) && IsValidPel(rightXabove) ) - { - abovecenter = leftXabove + rightXabove; - } - else - { - abovecenter = leftX + rightX; - } - if( IsValidPel(leftXbelow) && IsValidPel(rightXbelow) ) - { - belowcenter = leftXbelow + rightXbelow; - } - else - { - belowcenter = leftX + rightX; - } - newcenter = abovecenter + belowcenter; - if( newcenter > 4*leftX ) - { - rightX = rightX + 1; - } - else if( newcenter < 4*leftX) - { - leftX = leftX - 1; - } - else - { - rightX = rightX + 1; - } - writeXofY(right,i,rightX); - writeXofY(left,i,leftX); - if(rightX > R->xmax) {R->xmax = rightX;} - if(leftX < R->xmin) {R->xmin = leftX;} - } - if( !WeAreAtBottom(left,i) && (leftXbelow>=rightX)) - { -/* then we have a break in a near horizontal line in the middle */ - writeXofY(right,i,leftXbelow); - } - if( !WeAreAtBottom(right,i) && (leftX >=rightXbelow)) - { -/* then we have a break in a near horizontal line in the middle */ - writeXofY(left,i,rightXbelow); - } - } - left = right->link; - } -/* -There may be "implied horizontal lines" between edges that have -implications for continuity. This loop looks for white runs that -have implied horizontal lines on the top or bottom, and calls -CollapseWhiteRuns to check and fix any continuity problems from -them. -*/ - for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { - if ((!ISTOP(edge->flag) && !ISBOTTOM(edge->flag)) || ISLEFT(edge->flag)) - continue; /* at some future date we may want left edge logic here too */ - for (e2 = edge->link; VALIDEDGE(e2) && SAMESWATH(edge,e2); e2 = e2->link) { - if (ISTOP(e2->flag) && ISTOP(edge->flag) - && NONE != ImpliedHorizontalLine(edge,e2,edge->ymin)) { - if (ISLEFT(e2->flag)) - CollapseWhiteRun(R->anchor, edge->ymin-1, - edge, e2, edge->ymin); - } - if (ISBOTTOM(e2->flag) && ISBOTTOM(edge->flag) - && NONE != ImpliedHorizontalLine(edge,e2, edge->ymax)) { - if (ISLEFT(e2->flag)) - CollapseWhiteRun(R->anchor, edge->ymax, - edge, e2, edge->ymax-1); - } - } - } -} - - - - diff --git a/nx-X11/lib/font/Type1/hints.h b/nx-X11/lib/font/Type1/hints.h deleted file mode 100644 index 8e2ae2ade..000000000 --- a/nx-X11/lib/font/Type1/hints.h +++ /dev/null @@ -1,48 +0,0 @@ -/* $Xorg: hints.h,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/hints.h,v 1.3 1999/08/22 08:58:51 dawes Exp $ */ - -/*SHARED*/ - -#define InitHints t1_InitHints -extern void t1_InitHints ( void ); /* Initialize hint data structure */ - -#define CloseHints(hintP) t1_CloseHints(hintP) -/* Reverse hints that are still open */ -extern void t1_CloseHints ( struct fractpoint *hintP ); - -#define ProcessHint(hP, currX, currY, hintP) t1_ProcessHint(hP, currX, currY, hintP) -/* Process a rasterization hint */ -extern void t1_ProcessHint ( struct hintsegment *hP, fractpel currX, fractpel currY, struct fractpoint *hintP ); - -#define ApplyContinuity(R) t1_ApplyContinuity(R) -/* fix false connection breaks in a region */ -extern void t1_ApplyContinuity ( struct region *R ); - -/*END SHARED*/ diff --git a/nx-X11/lib/font/Type1/lines.c b/nx-X11/lib/font/Type1/lines.c deleted file mode 100644 index 835afc6ed..000000000 --- a/nx-X11/lib/font/Type1/lines.c +++ /dev/null @@ -1,189 +0,0 @@ -/* $Xorg: lines.c,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/lines.c,v 1.4tsi Exp $ */ - - /* LINES CWEB V0003 ******** */ -/* -:h1.LINES Module - Rasterizing Lines - -&author. Duaine W. Pryor, Jr. and Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - - -:h3.Include Files - -The included files are: -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "lines.h" - -/* -:h3.Functions Provided to the TYPE1IMAGER User - -None. -*/ - -/* -:h3.Functions Provided to Other Modules - -This module provides the following entry point to other modules: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.Macros Provided to Other Modules - -None. -*/ - -/* -:h2.StepLine() - Produces Run Ends for a Line After Checks - -The main work is done by Bresenham(); here we just perform checks and -get the line so that its Y direction is always increasing: -*/ - -void StepLine(R, x1, y1, x2, y2) - register struct region *R; /* region being built */ - register fractpel x1,y1; /* starting point */ - register fractpel x2,y2; /* ending point */ -{ - register fractpel dy; - - dy = y2 - y1; - -/* -We execute the "GOING_TO" macro to call back the REGIONS module, if -necessary (like if the Y direction of the edge has changed): -*/ - GOING_TO(R, x1, y1, x2, y2, dy); - - if (dy == 0) - return; - - if (dy < 0) - Bresenham(R->edge, x2, y2, x1, y1); - else - Bresenham(R->edge, x1, y1, x2, y2); - return; -} -/* -:h3.Bresenham() - Actually Produces Run Ends - -This routine runs a Bresenham line-stepping -algorithm. See, for example, Newman and Sproul, :hp1/Principles -of Interactive Computer Graphics/, pp. 25-27. -When we enter this, we -are guaranteed that dy is positive. -We'd like to work in 8 bit precision, so we'll define some macros and -constants to let us do that: -*/ - -#define PREC 8 /* we'll keep fraction pels in 8 bit precision */ -/* -RoundFP() rounds down by 'b' bits: -*/ -#define RoundFP(xy,b) (((xy)+(1<<((b)-1)))>>(b)) - -/* -TruncFP() truncates down by 'b' bits: -*/ -#define TruncFP(xy,b) ((xy)>>(b)) - - -void Bresenham(edgeP,x1,y1,x2,y2) - register pel *edgeP; /* pointer to top of list (y == 0) */ - register fractpel x1,y1; /* starting point on line */ - register fractpel x2,y2; /* ending point on the line (down) */ -{ - register long dx,dy; /* change in x and y, in my own precision */ - register long x,y; /* integer pel starting point */ - register int count; /* integer pel delta y */ - register long d; /* the Bresenham algorithm error term */ - - x1 = TruncFP(x1, FRACTBITS-PREC); - y1 = TruncFP(y1, FRACTBITS-PREC); - x2 = TruncFP(x2, FRACTBITS-PREC); - y2 = TruncFP(y2, FRACTBITS-PREC); - - dx = x2 - x1; - dy = y2 - y1; -/* -Find the starting x and y integer pel coordinates: -*/ - - x = RoundFP(x1,PREC); - y = RoundFP(y1,PREC); - edgeP += y; - count = RoundFP(y2,PREC) - y; -/*------------------------------------------------------------------*/ -/* Force dx to be positive so that dfy will be negative */ -/* this means that vertical moves will decrease d */ -/*------------------------------------------------------------------*/ - if (dx<0) - { - dx = -dx; -#define P PREC - d=(dy*(x1-(x<>P; -#undef P - while(--count >= 0 ) - { - while(d<0) - { - --x; - d += dy; - } - *(edgeP++) = x; - d -= dx; - } - } - else /* positive dx */ - { -#define P PREC - d = (dy*((x<>P; -#undef P - while(--count >= 0 ) - { - while(d<0) - { - ++x; - d += dy; - } - *(edgeP++) = x; - d -= dx; - } - } -} diff --git a/nx-X11/lib/font/Type1/lines.h b/nx-X11/lib/font/Type1/lines.h deleted file mode 100644 index f8ffd3a43..000000000 --- a/nx-X11/lib/font/Type1/lines.h +++ /dev/null @@ -1,39 +0,0 @@ -/* $Xorg: lines.h,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/lines.h,v 1.3 1999/08/22 08:58:52 dawes Exp $ */ - -/*SHARED*/ - -#define StepLine(R,x1,y1,x2,y2) t1_StepLine(R,x1,y1,x2,y2) -#define Bresenham(e,x1,y1,x2,y2) t1_Bresenham(e,x1,y1,x2,y2) - -extern void t1_StepLine ( struct region *R, fractpel x1, fractpel y1, fractpel x2, fractpel y2 ); -extern void t1_Bresenham ( pel *edgeP, fractpel x1, fractpel y1, fractpel x2, fractpel y2 ); - -/*END SHARED*/ diff --git a/nx-X11/lib/font/Type1/minimain.c b/nx-X11/lib/font/Type1/minimain.c deleted file mode 100644 index 4aa826dc1..000000000 --- a/nx-X11/lib/font/Type1/minimain.c +++ /dev/null @@ -1,48 +0,0 @@ -/* $Xorg: minimain.c,v 1.4 2001/02/09 02:04:01 xorgcvs Exp $ */ - -/* - -Copyright 1993, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -*/ - -#include "ximager5.h" - -main() -{ - XYspace S; - path p; - - InitImager(); - S = Scale(IDENTITY, 300.0, -300.0); - p = Join(Line(Loc(S, 0.0, 1.0)), Line(Loc(S, 1.0, 0.0))); - Interior(ClosePath(p), EVENODDRULE); -} - -void Trace() -{ -} - -void *DEFAULTDEVICE; diff --git a/nx-X11/lib/font/Type1/module/Imakefile b/nx-X11/lib/font/Type1/module/Imakefile deleted file mode 100644 index db8ab54f7..000000000 --- a/nx-X11/lib/font/Type1/module/Imakefile +++ /dev/null @@ -1,99 +0,0 @@ -XCOMM $XFree86: xc/lib/font/Type1/module/Imakefile,v 1.6 1999/08/14 10:49:18 dawes Exp $ - -#define IHaveModules -#include - -INCLUDES = -I$(FONTINCSRC) -I../ -I../../include -I$(XINCLUDESRC) \ - -I$(SERVERSRC)/include - -#if BuildCID -CIDSRCS = cidchar.c afm.c -CIDOBJS = cidchar.o afm.o -#if HasUsableFileMmap -MMAPDEFINES = -DUSE_MMAP -#endif -CIDDEFINES = -DBUILDCID -DHAVE_CFM $(MMAPDEFINES) -#endif - -DEFINES = -DFONTMODULE $(CIDDEFINES) - -SRCS = \ - arith.c \ - curves.c \ - fontfcn.c \ - hints.c \ - lines.c \ - objects.c \ - paths.c \ - regions.c \ - scanfont.c \ - spaces.c \ - t1funcs.c \ - t1info.c \ - t1io.c \ - t1malloc.c \ - t1snap.c \ - t1stub.c \ - token.c \ - type1.c \ - util.c \ - t1unicode.c \ - $(CIDSRCS) \ - type1mod.c - -OBJS = \ - arith.o \ - curves.o \ - fontfcn.o \ - hints.o \ - lines.o \ - objects.o \ - paths.o \ - regions.o \ - scanfont.o \ - spaces.o \ - t1funcs.o \ - t1info.o \ - t1io.o \ - t1malloc.o \ - t1snap.o \ - t1stub.o \ - token.o \ - type1.o \ - util.o \ - t1unicode.o \ - $(CIDOBJS) \ - type1mod.o - -LinkSourceFile(arith.c,..) -LinkSourceFile(curves.c,..) -LinkSourceFile(fontfcn.c,..) -LinkSourceFile(hints.c,..) -LinkSourceFile(lines.c,..) -LinkSourceFile(objects.c,..) -LinkSourceFile(paths.c,..) -LinkSourceFile(regions.c,..) -LinkSourceFile(scanfont.c,..) -LinkSourceFile(spaces.c,..) -LinkSourceFile(t1funcs.c,..) -LinkSourceFile(t1info.c,..) -LinkSourceFile(t1io.c,..) -LinkSourceFile(t1malloc.c,..) -LinkSourceFile(t1snap.c,..) -LinkSourceFile(t1stub.c,..) -LinkSourceFile(t1unicode.c,..) -LinkSourceFile(token.c,..) -LinkSourceFile(type1.c,..) -LinkSourceFile(util.c,..) -#if BuildCID -LinkSourceFile(afm.c,..) -LinkSourceFile(cidchar.c,..) -#endif - -ModuleObjectRule() -LibraryModuleTarget(type1,$(OBJS)) -InstallLibraryModule(type1,$(MODULEDIR),fonts) - -DependTarget() - -InstallDriverSDKLibraryModule(type1,$(DRIVERSDKMODULEDIR),fonts) diff --git a/nx-X11/lib/font/Type1/module/type1mod.c b/nx-X11/lib/font/Type1/module/type1mod.c deleted file mode 100644 index e652591a2..000000000 --- a/nx-X11/lib/font/Type1/module/type1mod.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 1998 The XFree86 Project, Inc. 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 THE - * XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Except as contained in this notice, the name of the XFree86 Project shall - * not be used in advertising or otherwise to promote the sale, use or other - * dealings in this Software without prior written authorization from the - * XFree86 Project. - */ -/* $XFree86: xc/lib/font/Type1/module/type1mod.c,v 1.10 2002/12/09 17:29:59 dawes Exp $ */ - -#include "misc.h" - -#include -#include "xf86Module.h" - -#ifdef HAVE_XORG_CONFIG_H -#include -#endif - -static MODULESETUPPROTO(type1Setup); - - /* - * This is the module data function that is accessed when loading - * libtype1 as a module. - */ - -static XF86ModuleVersionInfo VersRec = -{ - "type1", - MODULEVENDORSTRING, - MODINFOSTRING1, - MODINFOSTRING2, - XORG_VERSION_CURRENT, - 1, 0, 2, - ABI_CLASS_FONT, /* Font module */ - ABI_FONT_VERSION, - MOD_CLASS_FONT, - {0,0,0,0} /* signature, to be patched into the file by a tool */ -}; - -XF86ModuleData type1ModuleData = { &VersRec, type1Setup, NULL }; - -extern void Type1RegisterFontFileFunctions(void); -#ifdef BUILDCID -extern void CIDRegisterFontFileFunctions(void); -#endif - -FontModule type1Module = { - Type1RegisterFontFileFunctions, - "Type1", - NULL -}; - -#ifdef BUILDCID -FontModule CIDModule = { - CIDRegisterFontFileFunctions, - "CID", - NULL -}; -#endif - -static pointer -type1Setup(pointer module, pointer opts, int *errmaj, int *errmin) -{ - type1Module.module = module; - LoadFont(&type1Module); -#ifdef BUILDCID - CIDModule.module = module; - LoadFont(&CIDModule); -#endif - - /* Need a non-NULL return */ - return (pointer)1; -} diff --git a/nx-X11/lib/font/Type1/objects.c b/nx-X11/lib/font/Type1/objects.c deleted file mode 100644 index c86587dba..000000000 --- a/nx-X11/lib/font/Type1/objects.c +++ /dev/null @@ -1,1101 +0,0 @@ -/* $Xorg: objects.c,v 1.3 2000/08/17 19:46:30 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/objects.c,v 1.10tsi Exp $ */ - /* OBJECTS CWEB V0025 ******** */ -/* -:h1.OBJECTS Module - TYPE1IMAGER Objects Common Routines - -This module defines and implements the C structures that represent -objects in the TYPE1IMAGER. All common routines for manipulating these -objects are defined in this module. Specific routines for -specific objects are defined in the modules that deal with that -object type. - - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - - -:h3.Include Files - -The included files are: -*/ -#ifdef HAVE_CONFIG_H -#include -#endif -#define GLOBALS 1 /* see :hdref refid=debugvar. */ -/* -The following two includes are C standards; we include them because we -use 'toupper' and the 'str'-type functions in this module. Potentially -these may be defined as macros; if these ".h" files do not exist on your -system it is a pretty safe bet that these are external entry points and -you do do not need to include these header files. -*/ - -#ifndef FONTMODULE -#include -#include -#include -#include -#else -#include "Xdefs.h" /* Bool declaration */ -#include "Xmd.h" /* INT32 declaration */ -#include "os.h" -#include "xf86_ansic.h" -#endif - -/* -override incorrect system functions; for example you might define -a macro for "strcpy" that diverts it to "my_strcpy". -*/ - - /* moved these includes from above the */ - /* was included first (it contains com- */ - /* piler defines). dsr 081291 */ -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "fonts.h" -#include "pictures.h" -#include "strokes.h" -#include "cluts.h" - - -static char *TypeFmt(int type); - -/* -:h3.The "pointer" Macro - Define a Generic Pointer - -Sadly, many compilers will give a warning message when a pointer to -one structure is assigned to a pointer to another. We've even seen -some that give severe errors (when the wrong pointer type is used as -an initializer or returned from a function). TYPE1IMAGER has routines -like Dup and Allocate that are perfectly willing to duplicate or -allocate any of a number of different types of structures. How to -declare them in a truely portable way? - -Well, there is no single good answer that I've found. You can always -beg the question and "cast" everything. I find this distracting and the -resulting code ugly. On the other hand, we have found at least one -compiler that will accept "void *" as a generic pointer that can -assigned to any other pointer type without error or warning (apparently -this is also the ANSI standard). So, we define "void *" to be a generic -pointer. (You might have to change this for your compiler; the "ifndef" -allows the change to be made on the command line if you want.) -:i1/portability assumptions/ -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Functions Provided to the TYPE1IMAGER User - -This module provides the following TYPE1IMAGER entry points: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -Note that entry points that are intended for use external to TYPE1IMAGER -begin with the characters :q/xi/. Macros are used to make the names -more mnemonic. -*/ - -/* -:h3.Functions Provided to Other Modules - -This module provides the following functions for other modules: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -Note that entry points that intended for use within TYPE1IMAGER, but -which must be global because they are used across module boundaries, -begin with the characters :q/I_/. Macros are used to make the names -more mnemonic. - -Entry points totally within a module use mnemonic names and are -declared :hp2/static/. One of the compilers I used had a bug when -static functions were passed as addresses. Thus, some functions -which are logically "static" are not so declared. - -Note also the trick of declaring routines, like Consume(), with a -variable number of arguments. To avoid the restrictions on variable -numbers of arguments in the macro processor, we just replace the -text 'Consume' with 'I_Consume'. -*/ -/* -:h3.Macros Provided to Other Modules - -This is the module where we define all the useful constants like -TRUE, FALSE, and NULL, and simple expressions like MIN(), MAX(), and ABS(). -We might as well get to it right here: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -Notice that upper case is used for constant values and macro -definitions. I generally follow that convention. - -Many more global macros are defined later in this module. -*/ -/* -:h2.Basic TYPE1IMAGER Object Structure - -All TYPE1IMAGER objects which are available to the user have a common -header. This header is defined below: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -The following define is an attempt to centralize the definition of the -common xobject data shared by structures that are derived from the -generic xobject structure. For example, the structure font, defined in -fonts.shr : -&code. - struct font { - char type; - char flag; - int references; - ... other data types & structs ... - } -&ecode. -would now be defined as: -&code. - struct font { - XOBJ_COMMON - ... other data types & structs ... - } -&ecode. -Thus we have a better-structured inheritance mechanism. 3-26-91 PNM -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Object Type Definitions - -These constants define the values which go in the 'type' field of -an TYPE1IMAGER object structure: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Flag Byte Definitions - -Many programmers define flag bits as a mask (for example, 0x04), and -test, set, and reset them as follows: - -&code. - if ((flag & PERMANENT) != 0) - - flag |= PERMANENT; - flag &= &inv.PERMANENT; -:exmp. - -I favor a style where the 'if' statement can ask a question: - -&code. - if (ISPERMANENT(flag)) - - flag |= ISPERMANENT(ON); - flag &= &inv.ISPERMANENT(ON); - -:exmp. -This said, we now define two bit settings of the flag byte of the -object. "ISPERMANENT" will be set by the user, when he calls -Permanent(). "ISIMMORTAL" will be used for compiled-in objects -that we don't want the user to ever destroy. -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -Flag bit definitions that apply to all objects are assigned -starting with the least significant (0x01) bit. Flag bit definitions -specific to a certain object type are assigned starting with the -most significant (0x80) bit. We hope they never meet. -*/ -/* -:h3 id=preserve.PRESERVE() Macro - -Occasionally an TYPE1IMAGER operator is implemented by calling other -TYPE1IMAGER operators. For example, Arc2() calls Conic(). When we -call more than one operator as a subroutine, we have to be careful -of temporary objects. A temporary object will be consumed by the -subroutine operator and then is no longer available for the caller. -This can be prevented simply by bumping a temporary object's reference -count. -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.RefRoll() Macro to Detect References Count Rollover - -The following macro is designed to check for reference count rollover. -A return value of TRUE means rollover has not occurred; a return value -of FALSE means we cannot increment the reference count. Note also that -those functions that use this macro must decrement the reference count -afterwards. 3-26-91 PNM -*/ - -#define RefRoll(obj) (++(obj)->references > 0) - -/* -:h2.TYPE1IMAGER Object Functions - -:h3.LONGCOPY() - Macro to Copy "long" Aligned Data - -Copying arbitrary bytes in C is a bit of a problem. "strcpy" can't be -used, because 0 bytes are special-cased. Most environments have a -routine "memcopy" or "bcopy" or "bytecopy" that copies memory containing -zero bytes. Sadly, there is no standard on the name of such a routine, -which makes it impossible to write truely portable code to use it. - -It turns out that TYPE1IMAGER, when it wants to copy data, frequently -knows that both the source and destination are aligned on "long" -boundaries. This allows us to copy by using "long *" pointers. This -is usually very efficient on almost all processors. Frequently, it -is more efficient than using general-purpose assembly language routines. -So, we define a macro to do this in a portable way. "dest" and "source" -must be long-aligned, and "bytes" must be a multiple of "sizeof(long)": -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Allocate() - Allocating a Memory Block - -Allocate returns a pointer to memory object that is a copy of -the template passed (if any). In addition, extra bytes may be -allocated contiguously with the object. (This may be useful for -variable size objects such as edge lists. See :hdref refid=regions..) - -Allocate() always returns a non-immortal object, even if the template is -immortal. Therefore a non-NULL template must have a "flag" byte. - -If the template is NULL, then 'size' bytes are cleared to all NULLs. - -If the template is non-NULL, a new object is allocated in memory. -It therefore seems logical that its reference count field should be -set to 1. So, a nun-NULL template must also have a "references" field. -PNM 3-26-91 -*/ - -struct xobject * -t1_Allocate(int size, /* number of bytes to allocate & initialize */ - pointer ptr, /* example structure to allocate */ - int extra) /* any extra uninitialized bytes needed contiguously */ -{ - register struct xobject *template = (struct xobject *)ptr; - register struct xobject *r; - - /* - * round up 'size' and 'extra' to be an integer number of 'long's: - */ - size = (size + sizeof(long) - 1) & -(int)sizeof(long); - extra = (extra + sizeof(long) - 1) & -(int)sizeof(long); - if (size + extra <= 0) - Abort("Non-positive allocate?"); - r = (struct xobject *) xiMalloc(size + extra); - - while (r == NULL) { - if (!GimeSpace()) { - Abort("We have REALLY run out of memory"); - } - r = (struct xobject *) xiMalloc(size + extra); - } - - /* - * copy the template into the new memory: - */ - if (template != NULL) { - /* Added references count decrement if template is not permanent. - This is for the case where Allocate is called by a Dupxxxx - function, which was in turn called by Unique(). (PNM) */ - if (!ISPERMANENT(template->flag)) - --template->references; - LONGCOPY(r, template, size); - r->flag &= ~(ISPERMANENT(ON) | ISIMMORTAL(ON)); - /* added reference field 3-2-6-91 PNM */ - r->references = 1; - } - else { - register char **p1; - - for (p1=(char **)r; size > 0; size -= sizeof(char *)) - *p1++ = NULL; - } - - return(r); -} - -/* -:h3.Free() - Frees an Allocated Object - -This routine makes a sanity check to make sure the "type" field of the -standard object structure has not been cleared. If the object is -not a standard structure, then the macro "NonObjectFree" is available -that does not perform this check. - -In either case, the object must not be the NULL pointer. This preserves -portability, as the C system xiFree() will not always accept NULL. -*/ - -void -Free(pointer objPtr) -{ - struct xobject *obj = (struct xobject *)objPtr; /* structure to free */ - - if (obj->type == INVALIDTYPE) - Abort("Free of already freed object?"); - obj->type = INVALIDTYPE; - - xiFree((long *)obj); -} - -/* -:h3.Permanent() - Makes an Object Permanent - -Real simple--just set a flag. Every routine that consumes its objects -(which is almost every user entry) must check this flag, and not consume -the object if it is set. - -If a temporary object is made permanent, and there is more than one -reference to it, we must first Copy() it, then set the ISPERMANENT -flag. Note also that the reference count must be incremented when an -object is changed from temporary to permanent (see the ISUNIQUE macro). - -Note that the purpose of this function is to convert an object into a -permanent object: - If it was permanent to begin with, we do nothing; - If it was temporary and unique, we set the PERMANENT flag and increment -the reference count; - If it was temporary and nonunique, we must make a unique Copy(), set -the PERMANENT flag, and set the reference count to 2. We must also -decrement the original object's reference count, because what we have -done is to change one of the old temporary handles to a permanent one. -3-26-91 PNM -*/ - -struct xobject * -t1_Permanent(pointer objPtr) -{ - struct xobject *obj = (struct xobject *)objPtr; /* object to be made permanent */ - - if ( (obj != NULL) && ( !(ISPERMANENT(obj->flag)) ) ) - { - /* there is a non-NULL, temporary object to be made permanent. - If there are multiple references to this object, first get - a new COPY(). - Note also that we have to decrement the reference count if - we do a Copy() here, because we are consuming the temporary - argument passed, and returning a unique, permanent one. - */ - if ( obj->references > 1) - { - obj = Copy(obj); - } - /* now set the permanent flag, and increment the reference - count, since a temporary object has now become permanent. */ - obj->references++; - obj->flag |= ISPERMANENT(ON); - } - return(obj); -} - -#ifdef notused -/* -:h3.Temporary() - Undoes the Effect of "Permanent()" - -This simply resets the "ISPERMANENT" flag. - -If a permanent object is made temporary, and there is more than one reference -to it, we must first Copy() it, then reset the ISPERMANENT flag. However, -if the permanent object has obly one reference, we need only decrement the -reference count ( and reset the flag). - -Note that this function, in the case of a PERMANENT argument, basically -converts the PERMANENT handle to a TEMPORARY one. Thus, in the case of -a nonunique, permanent argument passed, we not only make a Copy(), -we also decrement the reference count, to reflect the fact that we have -lost a permanent handle and gained a temporary one. -PNM 3-2-6-91 -*/ - -struct xobject * -xiTemporary(pointer objPtr) -{ - register struct xobject *obj - = (struct xobject *)objPtr; /* object to be made permanent */ - if (obj != NULL) { - /* if it's already temporary, there's nothing to do. */ - if ISPERMANENT(obj->flag) - { - /* if there are multiple references to this object, get a - Copy we can safely alter. Recall that the reference count - is incremented for permanent objects. - Recall further that Copy returns an object with the - same flag state and a reference count of 2 (for PERMANENT - objects). - Thus, regardless of whether or not we need to copy a - permanent object, we still decrement its reference - count and reset the flag. - */ - if (obj->references != 2 || ISIMMORTAL(obj->flag)) - { - /* not unique; consume handle, get a temporary Copy! */ - obj = Copy(obj); - } - /* else decrement the reference count (since it's going from - permanent to temporary) and clear the flag. */ - else { - obj->references--; - obj->flag &= ~ISPERMANENT(ON); - } - } - } - return(obj); -} -#endif /* notused */ - -/* -:h3.Dup() - Duplicate an Object - -Dup will increment the reference count of an object, only making a -Copy() if needed. -Note that Dup() retains the state of the permanent flag. -3-26-91 PNM -*/ - - -struct xobject * -t1_Dup(pointer objPtr) -{ - register struct xobject *obj - = (struct xobject *)objPtr; /* object to be duplicated */ - register char oldflag; /* copy of original object's flag byte */ - - if (obj == NULL) - return(NULL); - /* An immortal object must be Copy'ed, so that we get a mortal - copy of it, since we try not to destroy immortal objects. */ - if (ISIMMORTAL(obj->flag)) - return(Copy(obj)); - - /* if incrementing the reference count doesn't cause the count - to wrap, simply return the object with the count bumped. Note - that the RefRoll macro increments the count to perform the - rollover check, so we must decrement the count. */ - if (RefRoll(obj)) - return(obj); - - /* that didn't work out, so put the count back and call Copy(). */ - --obj->references; - oldflag = obj->flag; - obj = Copy(obj); - if (ISPERMANENT(oldflag)) - obj = Permanent(obj); - return(obj); -} - -/* -:h3.Copy() - Make a New Copy of an Object - -This is the generic Copy() where the object type is unknown. There -are specific Copyxxx functions for known object types. - -Copy will create a NEW temporary object, and WILL NOT simply bump the -reference count. - -Sometimes duplicating an object is just as simple as Allocating with it -as a template. But other objects are complicated linked lists. So, we -let each module provide us a routine (or macro) that duplicates the -objects it knows about. -*/ - -struct xobject * -t1_Copy(pointer objPtr) -{ - register struct xobject *obj - = (struct xobject *)objPtr; /* object to be Copy'ed */ - if (obj == NULL) - return(NULL); - - if (ISPATHTYPE(obj->type)) - obj = (struct xobject *) CopyPath((struct segment *)obj); - else - switch (obj->type) { - case SPACETYPE: - obj = (struct xobject *) - CopySpace((struct XYspace *)obj); - break; - case FONTTYPE: - obj = (struct xobject *) CopyFont(obj); break; - case REGIONTYPE: - obj = (struct xobject *) - CopyRegion((struct region *)obj); - break; - case PICTURETYPE: - obj = (struct xobject *) CopyPicture(obj); break; - case LINESTYLETYPE: - obj = (struct xobject *) CopyLineStyle(obj); break; - case STROKEPATHTYPE: - obj = (struct xobject *) CopyStrokePath(obj); break; - case CLUTTYPE: - obj = (struct xobject *) CopyCLUT(obj); break; - default: - return(ArgErr("Copy: invalid object", obj, NULL)); - } - - return(obj); -} - -/* -:h3.Destroy() - Destroys an Object - -This can get complicated. Just like with Copy(), we let the experts -handle it. -*/ -struct xobject * -Destroy(pointer objPtr) -{ - register struct xobject *obj - = (struct xobject *)objPtr; /* object to be destroyed */ - if (obj == NULL) - return(NULL); - if (ISIMMORTAL(obj->flag)) { - return(NULL); - } - if (ISPATHTYPE(obj->type)) - KillPath((struct segment *)obj); - else { - switch (obj->type) { - case REGIONTYPE: - KillRegion((struct region *)obj); - break; - case SPACETYPE: - KillSpace(obj); - break; - case LINESTYLETYPE: - KillLineStyle(obj); - break; - case FONTTYPE: - KillFont(obj); - break; - case PICTURETYPE: - KillPicture(obj); - break; - case STROKEPATHTYPE: - KillStrokePath(obj); - break; - case CLUTTYPE: - KillCLUT(obj); - break; - default: - return(ArgErr("Destroy: invalid object", obj, NULL)); - } - } - return(NULL); -} -/* -:h2.Generally Useful Macros - -:h3.FOLLOWING() - Macro to Point to the Data Following a Structure - -There are several places in TYPE1IMAGER where we will allocate variable -data that belongs to a structure immediately after that structure. -This is a performance technique, because it reduces the number of -trips we have to take through xiMalloc() and xiFree(). It turns out C has -a very convenient way to point past a structure--if 'p' is a pointer -to a structure, 'p+1' is a pointer to the data after it. This -behavior of C is somewhat startling and somewhat hard to follow, if -you are not used to it, so we define a macro to point to the data -following a structure: -*/ -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.TYPECHECK() - Verify the Type of an Argument - -This macro tests the type of an argument. If the test fails, it consumes -any other arguments as necessary and causes the imbedding routine to -return the value 'whenBAD'. - -Note that the consumeables list should be an argument list itself, for -example (0) or (2,A,B). See :hdref refid=consume. below. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.ARGCHECK() - Perform an Arbitrary Check on an Argument - -This macro is a generalization of TYPECHECK to take an arbitrary -predicate. If the error occurs (i.e., the predicate is true), the -arbitrary message 'msg' is returned. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.TYPENULLCHECK() - Extension of TYPECHECK() for NULL arguments - -Many routines allow NULLs to be passed as arguments. 'whenBAD' will -be returned in this case, too. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.MAKECONSUME() - Create a "Consume"-type Macro - -Consuming an object means destroying it if it is not permanent. This -logic is so common to all the routines, that it is immortalized in this -macro. For example, ConsumePath(p) can be simply defined as -MAKECONSUME(p,KillPath(p)). In effect, this macro operates on a -meta-level. -:i1/consuming objects/ -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.MAKEUNIQUE() - Create a "Unique"-type Macro - -Many routines are written to modify their arguments in place. Thus, -they want to insure that they duplicate an object if it is permanent. -This is called making an object "unique". For example, UniquePath(p) -can be simply defined as MAKEUNIQUE(p,DupPath(p)). -:i1/unique objects/ -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -An object is unique (and directly alterable) if there is only one -reference to it, and it is not permanent (in which case we increment -the reference count, so we don't have to check the permanent bit). -3-26-91 PNM - -Note the rules for making a unique object: -&drawing. - IF (obj->references = 1) return(obj); - ELSE (references > 1) - IF (ISPERMANENT(obj->flag)) return(Dupxxx(obj)); - ELSE (nonunique, temporary object!) - obj->references--; return(Dupxxx(obj)); -&edrawing. -If we must make a Copy of a nonunique, temporary object, we decrement -reference count of the original object! -*/ - -/* -:h3.Unique() - Make a Unique Object - -Here is a generic 'Unique' function if the object type is not known. -Why didn't we build it with the MAKEUNIQUE macro, you ask? Well, we -used to, but there is at least one damn compiler in the world that -raises errors if the types of an "(a) ? b : c" expression do not match. -Also, when we changed Dup() to retain the permanent/temporary flag, we -wanted to make sure "Unique" always returned a temporary object. - -Note that we cannot use Dup() to create a copy of the object in question, -because Dup() may simply bump the reference count, and not return a -unique copy to us. That is why we use t1_Copy(). - -The purpose of this function is to make sure we have a copy of an object -that we can safely alter: -:ol. -:li.If we have a unique, temporary object, we simply return the argument. -:li.If we have a nonunique, temporary object, we have to make a new copy -of it, and decrement the reference count of the original object, to reflect -the fact that we traded temporary handles. -:li.If we have a permanent object, we make a temporary copy of it, but -we do not decrement the reference count of the original permanent object, -because permanent objects, by definition, are persistent. 3-2-6-91 PNM -:eol. -*/ - -struct xobject * -t1_Unique(pointer objPtr) -{ - struct xobject *obj = (struct xobject *)objPtr; - - /* if the original object is not already unique, make a unique - copy...Note also that if the object was not permanent, we must - consume the old handle! 3-26-91 PNM - NOTE : consumption of the old handle moved to Allocate. 4-18-91 */ - if (!obj || obj->references == 1) - return(obj); - - obj = Copy(obj); - /* and make sure we return a temporary object ! */ - if (ISPERMANENT(obj->flag)) - { - obj->flag &= ~ISPERMANENT(ON); - obj->references--; - } - return(obj); -} - - -/* -:h2.Initialization, Error, and Debug Routines - -:h3 id=debugvar.Declarations for Debug Purposes - -We declare all the debug flags here. Some link editors make the not -unreasonable restriction that only one module may declare and -initialize global variables; all the rest must declare the variable -'extern'. This is logical, but is somewhat awkward to implement with -C include files. We solve the problem by temporarily making the name -'extern' a null name if GLOBALS is defined. (GLOBALS is only defined -in this OBJECTS module.) Since 'externs' can't be initialized, we -have to handle that with #defines too. -:i1/GLOBALS (&#define.)/ -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -static char *ErrorMessage = NULL; - -/* -:h3.Pragmatics() - Set/Reset Debug Flags - -We provide a controlled way for the TYPE1IMAGER user to set and reset -our debugging and tracing: -*/ -void -Pragmatics(char *username, /* name of the flag */ - int value) /* value to set it to */ -{ - register char *p; /* temporary loop variable */ -#define NAMESIZE 40 - char name[NAMESIZE]; /* buffer to store my copy of 'username' */ - - if (strlen(username) >= (unsigned)NAMESIZE) - Abort("Pragmatics name too large"); - strcpy(name, username); - for (p = name; *p != '\0'; p++) - *p = toupper(*p); - - if (!strcmp(name, "ALL")) - MustTraceCalls = InternalTrace = /* MustCrash = */ - LineIOTrace = value; - - else if (!strcmp(name, "LINEIOTRACE")) - LineIOTrace = value; - - else if (!strcmp(name, "TRACECALLS")) - MustTraceCalls = value; - - else if (!strcmp(name, "CHECKARGS")) - MustCheckArgs = value; - - else if (!strcmp(name, "PROCESSHINTS")) - ProcessHints = value; - - else if (!strcmp(name, "SAVEFONTPATHS")) - SaveFontPaths = value; - - else if (!strcmp(name, "CRASTERCOMPRESSIONTYPE")) - CRASTERCompressionType = value; - - else if (!strcmp(name, "CRASHONUSERERROR")) - MustCrash = value; - - else if (!strcmp(name, "DEBUG")) - StrokeDebug = SpaceDebug = PathDebug = ConicDebug = LineDebug = - RegionDebug = MemoryDebug = FontDebug = - HintDebug = ImageDebug = OffPageDebug = value; - - else if (!strcmp(name, "CONICDEBUG")) - ConicDebug = value; - - else if (!strcmp(name, "LINEDEBUG")) - LineDebug = value; - - else if (!strcmp(name, "REGIONDEBUG")) - RegionDebug = value; - - else if (!strcmp(name, "PATHDEBUG")) - PathDebug = value; - - else if (!strcmp(name, "SPACEDEBUG")) - SpaceDebug = value; - - else if (!strcmp(name, "STROKEDEBUG")) - StrokeDebug = value; - - else if (!strcmp(name, "MEMORYDEBUG")) - MemoryDebug = value; - - else if (!strcmp(name, "FONTDEBUG")) - FontDebug = value; - - else if (!strcmp(name, "HINTDEBUG")) - HintDebug = value; - - else if (!strcmp(name, "IMAGEDEBUG")) - ImageDebug = value; - - else if (!strcmp(name, "OFFPAGEDEBUG")) - OffPageDebug = value; - -#ifdef MC68000 -/* -The following pragmatics flag turns on or off instruction histograming -for performance analysis. It is only defined in the Delta card -environment. -*/ - else if (!strcmp(name, "PROFILE")) { - if (value) - StartProfile(); - else - StopProfile(); - } -#endif - else if (!strcmp(name, "FLUSHCACHE")) { -#ifdef notdef - while (GimeSpace()) { ; } -#endif - } - - else if (!strcmp(name, "CACHEDCHARS")) - CachedChars = (value <= 0) ? 1 : value; - - else if (!strcmp(name, "CACHEDFONTS")) - CachedFonts = (value <= 0) ? 1 : value; - - else if (!strcmp(name, "CACHEBLIMIT")) - CacheBLimit = value; - - else if (!strcmp(name, "CONTINUITY")) - Continuity = value; - - - else { - printf("Pragmatics flag = '%s'\n", name); - ArgErr("Pragmatics: flag not known", NULL, NULL); - } - return; -} - -/* -:h3.Consume() - Consume a List of Arguments - -This general purpose routine is provided in the case where the object -type(s) to be consumed are unknown or not yet verified, and/or it is -not known whether the object is permanent. - -If the type of the argument is known, it is faster to directly consume -that type, for example, ConsumeRegion() or ConsumePath(). Furthermore, -if it is already known that the object is temporary, it is faster to -just kill it rather than consume it, for example, KillSpace(). -*/ - -void -Consume(int n, ...) -{ - struct xobject *obj; - va_list ap; - - va_start(ap, n); - - while (n-- > 0) { - obj = va_arg(ap, struct xobject *); - if (obj != NULL && !ISPERMANENT(obj->flag)) - Destroy(obj); - } -} - -/* -:h3.TypeErr() - Handles "Invalid Object Type" Errors -*/ - -struct xobject * -TypeErr(char *name, /* Name of routine (for error message) */ - pointer objPtr, /* Object in error */ - int expect, /* type expected */ - pointer retPtr) /* object to return to caller */ -{ - struct xobject *obj = (struct xobject *)objPtr; - struct xobject *ret = (struct xobject *)retPtr; - /* - * This buffer must be large enough to hold 'name' plus - * two of the largest strings that can be returned by TypeFmt. - * The largest value of 'name' is currently 9 ("ClosePath") - * and the longest strings in TypeFmt are 30 characters. - */ - static char typemsg[115]; - - if (MustCrash) - LineIOTrace = TRUE; - - sprintf(typemsg, "Wrong object type in %s. Expected %s; was %s.\n", - name, TypeFmt(expect), TypeFmt(obj->type)); - - if (MustCrash) - Abort("Terminating because of CrashOnUserError..."); - else - ErrorMessage = typemsg; - -/* changed ISPERMANENT to ret->references > 1 3-26-91 PNM */ - if (ret != NULL && (ret->references > 1)) - ret = Dup(ret); - return(ret); -} - -/* -:h4.TypeFmt() - Returns Pointer to English Name of Object Type - -This is a subroutine of TypeErr(). -*/ - -static char * -TypeFmt(int type) /* type field */ -{ - char *r; - - if (ISPATHTYPE(type)) - if (type == TEXTTYPE) - r = "path or region (from TextPath)"; - else - r = "path"; - else { - switch (type) { - case INVALIDTYPE: - r = "INVALID (previously consumed?)"; - break; - case REGIONTYPE: - r = "region"; - break; - case SPACETYPE: - r = "XYspace"; - break; - case LINESTYLETYPE: - r = "linestyle"; - break; - case FONTTYPE: - r = "font"; - break; - case PICTURETYPE: - r = "picture"; - break; - case STROKEPATHTYPE: - r = "path (from StrokePath)"; - break; - default: - r = "UNKNOWN"; - break; - } - } - return(r); -} -/* -:h3.ArgErr() - Invalid Argument Passed to a Routine - -A common routine to report argument errors. It is usually called -is returned to the caller in case MustCrash is FALSE and ArgErr -returns to its caller. -*/ - -struct xobject * -ArgErr(char *string, /* description of error */ - pointer objPtr, /* object, if any, that was in error */ - pointer retPtr) /* object returned to caller or NULL */ -{ - struct xobject *ret = (struct xobject *)retPtr; - - if (MustCrash) - LineIOTrace = TRUE; - - if (MustCrash) - Abort("Terminating because of CrashOnUserError..."); - else - ErrorMessage = string; - return(ret); -} - -/* -:h3.Abort() - Crash Due to Error - -Defined in objects.h to be FatalError(), the server's abort routine. -*/ - -/* -:h3.REAL Miscellaneous Stuff - -:h4.ErrorMsg() - Return the User an Error Message -*/ - -char * -ErrorMsg(void) -{ - register char *r; - - r = ErrorMessage; - ErrorMessage = NULL; - return(r); -} - -/* -:h4.InitImager() - Initialize TYPE1IMAGER - -We check that a short is 16 bits and a long 32 bits; we have made -those assumptions elsewhere in the code. (This is almost a C standard, -anyway.) Note that TYPE1IMAGER makes no assumptions about the size of an -'int'! -:i1/portability assumptions/ -*/ - -void -InitImager(void) -{ - -/* Check to see if we have been using our own malloc. If so,*/ -/* Undef malloc so that we can get to the system call. */ -/* All other calls to malloc are defined to xiMalloc. */ - - -/* if (sizeof(short) != 2 || sizeof(INT32) != 4) - Abort("Fundamental TYPE1IMAGER assumptions invalid in this port"); -*/ - InitSpaces(); - InitFonts(); - InitFiles(); -/* -In some environments, constants and/or exception handling need to be -*/ - LibInit(); -} -/* -:h4.TermImager() - Terminate TYPE1IMAGER - -This only makes sense in a server environment; true TYPE1IMAGER needs do -nothing. -*/ -void -TermImager(void) -{ - return; -} -#ifdef notused -/* -:h4.reportusage() - A Stub to Get a Clean Link with Portable PMP -*/ -void -reportusage(void) -{ - return; -} -#endif diff --git a/nx-X11/lib/font/Type1/objects.h b/nx-X11/lib/font/Type1/objects.h deleted file mode 100644 index 7552f98d9..000000000 --- a/nx-X11/lib/font/Type1/objects.h +++ /dev/null @@ -1,354 +0,0 @@ -/* $Xorg: objects.h,v 1.3 2000/08/17 19:46:31 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/objects.h,v 1.14tsi Exp $ */ -/*SHARED*/ - -/*END SHARED*/ -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#include -#include -#ifndef FONTMODULE -#include -#endif -/*SHARED*/ - -#define Permanent(obj) t1_Permanent(obj) -#ifdef notused -#define Temporary(obj) t1_Temporary(obj) -#endif -#define Destroy(obj) t1_Destroy(obj) -#define Dup(obj) t1_Dup(obj) -#define InitImager t1_InitImager -#define TermImager t1_TermImager -#define Pragmatics(f,v) t1_Pragmatics(f,v) -#define ErrorMsg t1_ErrorMsg - -/* make an object permanent */ -extern struct xobject *t1_Permanent ( pointer obj ); - -#ifdef notused -/* make an object temporary */ -extern struct xobject *t1_Temporary( pointer obj ); -#endif - -/* destroy an object */ -extern struct xobject *t1_Destroy ( pointer obj ); - -/* duplicate an object */ -extern struct xobject *t1_Dup ( pointer obj ); - - -extern void t1_InitImager ( void ); /* initialize TYPE1IMAGER */ -extern void t1_TermImager ( void ); /* terminate TYPE1IMAGER */ -/* set debug flags, etc. */ -extern void t1_Pragmatics ( char *username, int value ); - -/* return last TYPE1IMAGER error message */ -extern char *t1_ErrorMsg ( void ); - -/*END SHARED*/ -/*SHARED*/ -extern void xiFree ( long *addr ); -extern char *xiMalloc ( unsigned Size ); -extern void addmemory ( long *addr, long size ); -extern void delmemory ( void ); - -#ifndef OS_H -extern void FatalError(const char *f, ...) -#if defined(__GNUC__) && \ - ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ > 4))) -__attribute((noreturn)) -#endif -; - -extern void ErrorF(const char *f, ...); -#endif - -#define Abort(line) FatalError(line) -#define Allocate(n,t,s) t1_Allocate(n,t,s) -#define Free(obj) t1_Free(obj) -#define NonObjectFree(a) xiFree((long *)(a)) -#define Consume t1_Consume -#define ArgErr(s,o,r) t1_ArgErr(s,o,r) -#define TypeErr(n,o,e,r) t1_TypeErr(n,o,e,r) -#define Copy(obj) t1_Copy(obj) -#define Unique(obj) t1_Unique(obj) - -/* allocate memory */ -extern struct xobject *t1_Allocate( int size, pointer template, - int extra ); - -/* free memory */ -extern void t1_Free ( pointer obj ); - -/* make a unique temporary copy of an object */ -extern struct xobject *t1_Unique ( pointer obj ); - -/* handle argument errors */ -extern struct xobject *t1_ArgErr ( char *string, pointer obj, pointer ret ); - -/* handle 'bad type' argument errors */ -extern struct xobject *t1_TypeErr ( char *name, pointer obj, - int expect, pointer ret ); - -/* consume a variable number of arguments */ -extern void t1_Consume ( int n, ... ); - -/* make a new copy, not reference bump PNM */ -extern struct xobject *t1_Copy ( pointer obj ); - - -/*END SHARED*/ -/*SHARED*/ - -#define ON (~0) /* all bits on */ -#ifndef FALSE -#define FALSE 0 /* handy zero value */ -#endif -#ifndef TRUE -#define TRUE 1 /* handy non-zero value */ -#endif - -#ifndef NULL -#include -/* -The NULL pointer is system specific. (Most systems, however, use 0.) -TYPE1IMAGER could have its own NULL, independent of the rest of the system, -were it not for malloc(). The system call malloc() returns NULL when -out of memory. -:i1/portibility assumptions/ -*/ -#endif - -#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 - -/*END SHARED*/ -/*SHARED*/ - -struct xobject { - char type; /* encoded type of object */ - unsigned char flag; /* flag byte for temporary object characteristics*/ - short references; /* count of pointers to this object - (plus 1 for permanent objects) PNM */ -} ; - -/*END SHARED*/ -/*SHARED*/ - -#define XOBJ_COMMON char type; unsigned char flag; short references; - -/*END SHARED*/ -/*SHARED*/ - - -#define INVALIDTYPE 0 -#define FONTTYPE 1 -#define REGIONTYPE 3 -#define PICTURETYPE 4 -#define SPACETYPE 5 -#define LINESTYLETYPE 6 -#define EDGETYPE 7 -#define STROKEPATHTYPE 8 -#define CLUTTYPE 9 - -#define ISPATHTYPE(type) ((type)&0x10) /* all path segments have this bit on */ -#define LINETYPE (0+ISPATHTYPE(ON)) -#define CONICTYPE (1+ISPATHTYPE(ON)) -#define BEZIERTYPE (2+ISPATHTYPE(ON)) -#define HINTTYPE (3+ISPATHTYPE(ON)) - -#define MOVETYPE (5+ISPATHTYPE(ON)) -#define TEXTTYPE (6+ISPATHTYPE(ON)) - -/*END SHARED*/ -/*SHARED*/ - -#define ISPERMANENT(flag) ((flag)&0x01) -#define ISIMMORTAL(flag) ((flag)&0x02) - -/*END SHARED*/ -/*SHARED*/ - -#define PRESERVE(obj) if (!ISPERMANENT((obj)->flag)) \ - (obj)->references++; - -/*END SHARED*/ -/*SHARED*/ - -#define LONGCOPY(dest,source,bytes) { \ - register long *p1 = (long *)dest; register long *p2 = (long *)source; \ - register int count = (bytes) / sizeof(long); \ - while (--count >= 0) *p1++ = *p2++; } - - -/*END SHARED*/ -/*SHARED*/ - -#define FOLLOWING(p) ((p)+1) - -/*END SHARED*/ -/*SHARED*/ - -#define TYPECHECK(name, obj, expect, whenBAD, consumables, rettype) { \ - if (obj->type != expect) { \ - (Consume)consumables; \ - return((rettype)TypeErr(name, obj, expect, whenBAD)); \ - } \ -} - -/*END SHARED*/ -/*SHARED*/ - -#define ARGCHECK(test,msg,obj,whenBAD,consumables,rettype) { \ - if (test) { \ - (Consume)consumables; \ - return((rettype)ArgErr(msg, obj, whenBAD)); \ - } \ -} - -/*END SHARED*/ -/*SHARED*/ - -/* Changed use of Dup() below to Temporary(Copy()) because Dup() does not - necessarily return a Unique Copy anymore! 3-26-91 */ -#define TYPENULLCHECK(name, obj, expect, whenBAD, consumables,rettype) \ - if (obj == NULL) { \ - (Consume)consumables; \ - if (whenBAD != NULL && ISPERMANENT(whenBAD->flag)) \ - return((rettype)Temporary(Copy(whenBAD))); \ - else return((rettype)whenBAD); \ - } else { \ - if (obj->type != expect) { \ - (Consume)consumables; \ - return((rettype)TypeErr(name, obj, expect, whenBAD)); \ - } \ - } -/*END SHARED*/ -/*SHARED*/ - -#define MAKECONSUME(obj,stmt) { if (!ISPERMANENT(obj->flag)) stmt; } - -/*END SHARED*/ -/*SHARED*/ - -#define MAKEUNIQUE(obj,stmt) ( ( (obj)->references > 1 ) ? stmt : obj ) - -/*END SHARED*/ -/*SHARED*/ - -#ifdef GLOBALS - -#define extern -#define INITIALIZED(value) = value - -#else - -#define INITIALIZED(value) - -#endif - -extern char MustCheckArgs INITIALIZED(TRUE); -extern char MustTraceCalls INITIALIZED(FALSE); -#if XFONT_CID -extern char MustCrash INITIALIZED(FALSE); -#else -extern char MustCrash INITIALIZED(TRUE); -#endif -extern char InternalTrace INITIALIZED(TRUE); -extern char LineIOTrace INITIALIZED(TRUE); - -extern char ProcessHints INITIALIZED(TRUE); - -extern char SaveFontPaths INITIALIZED(TRUE); - -extern short CRASTERCompressionType INITIALIZED(1); - -extern char ConicDebug INITIALIZED(0); -extern char LineDebug INITIALIZED(0); -extern char RegionDebug INITIALIZED(0); -extern char PathDebug INITIALIZED(0); -extern char FontDebug INITIALIZED(0); -extern char SpaceDebug INITIALIZED(0); -extern char StrokeDebug INITIALIZED(0); -extern char MemoryDebug INITIALIZED(0); -extern char HintDebug INITIALIZED(0); -extern char ImageDebug INITIALIZED(0); -extern char OffPageDebug INITIALIZED(0); - -extern short CachedChars INITIALIZED(0x7FFF); -extern short CachedFonts INITIALIZED(0x7FFF); -extern int CacheBLimit INITIALIZED(12500); -extern char Continuity INITIALIZED(2); - -#ifdef extern -#undef extern -#endif - -/* -We define other routines formatting parameters -*/ -#define DumpArea(area) t1_DumpArea(area) -#define DumpText(text) t1_DumpText(text) -#define DumpPath(path) t1_DumpPath(path) -#define DumpSpace(space) t1_DumpSpace(space) -#define DumpEdges(e) t1_DumpEdges(e) -#define FormatFP(s,p) t1_FormatFP(s,p) - -/* dump a textpath structure */ -extern void t1_DumpText(void); - -/*END SHARED*/ diff --git a/nx-X11/lib/font/Type1/paths.c b/nx-X11/lib/font/Type1/paths.c deleted file mode 100644 index 1ab25ecef..000000000 --- a/nx-X11/lib/font/Type1/paths.c +++ /dev/null @@ -1,1406 +0,0 @@ -/* $Xorg: paths.c,v 1.3 2000/08/17 19:46:31 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/paths.c,v 1.7tsi Exp $ */ - - /* PATHS CWEB V0021 ******** */ -/* -:h1 id=paths.PATHS Module - Path Operator Handler - -This is the module that is responsible for building and transforming -path lists. - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - - -:h3.Include Files - -The included files are: -*/ - - /* after the system includes (dsr) */ -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -# include "os.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" /* understands about Union */ -#include "fonts.h" /* understands about TEXTTYPEs */ -#include "pictures.h" /* understands about handles */ -#include "strokes.h" /* understands how to coerce stroke paths */ -#include "trig.h" - - -/* -:h3.Routines Available to the TYPE1IMAGER User - -The PATHS routines that are made available to the outside user are: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Functions Provided to Other Modules - -The path routines that are made available to other TYPE1IMAGER modules -are defined here: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -NOTE: because of the casts put in the macros for Loc, ArcCA, Conic, -RoundConic, PathSegment, and JoinSegment, we cannot use the macro names -when the functions are actually defined. We have to use the unique -names with their unique first two characters. Thus, if anyone in the -future ever decided to change the first two characters, it would not be -enough just to change the macro (as it would for most other functions). -He would have to also change the function definition. -*/ -/* -:h3.Macros Provided to Other Modules - -The CONCAT macro is defined here and used in the STROKES module. See -:hdref refid=pathmac.. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h2.Path Segment Structures - -A path is represented as a linked list of the following structure: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -When 'link' is NULL, we are at the last segment in the path (surprise!). - -'last' is only non-NULL on the first segment of a path, -for all the other segments 'last' == NULL. We test for a non-NULL -'last' (ISPATHANCHOR predicate) when we are given an alleged path -to make sure the user is not trying to pull a fast one on us. - -A path may be a collection of disjoint paths. Every break in the -disjoint path is represented by a MOVETYPE segment. - -Closed paths are discussed in :hdref refid=close.. - -:h3.CopyPath() - Physically Duplicating a Path - -This simple function illustrates moving through the path linked list. -Duplicating a segment just involves making a copy of it, except for -text, which has some auxilliary things involved. We don't feel -competent to duplicate text in this module, so we call someone who -knows how (in the FONTS module). -*/ -struct segment * -CopyPath(struct segment *p0) /* path to duplicate */ -{ - register struct segment *p,*n = NULL,*last = NULL,*anchor; - - for (p = p0, anchor = NULL; p != NULL; p = p->link) { - - ARGCHECK((!ISPATHTYPE(p->type) || (p != p0 && p->last != NULL)), - "CopyPath: invalid segment", p, NULL, (0), struct segment *); - - if (p->type == TEXTTYPE) - n = (struct segment *) CopyText(p); - else - n = (struct segment *)Allocate(p->size, p, 0); - n->last = NULL; - if (anchor == NULL) - anchor = n; - else - last->link = n; - last = n; - } -/* -At this point we have a chain of newly allocated segments hanging off -'anchor'. We need to make sure the first segment points to the last: -*/ - if (anchor != NULL) { - n->link = NULL; - anchor->last = n; - } - - return(anchor); -} -/* -:h3.KillPath() - Destroying a Path - -Destroying a path is simply a matter of freeing each segment in the -linked list. Again, we let the experts handle text. -*/ -void -KillPath(struct segment *p) /* path to destroy */ -{ - register struct segment *linkp; /* temp register holding next segment*/ - - /* return conditional based on reference count 3-26-91 PNM */ - if ( (--(p->references) > 1) || - ( (p->references == 1) && !ISPERMANENT(p->flag) ) ) - return; - - while (p != NULL) { - if (!ISPATHTYPE(p->type)) { - ArgErr("KillPath: bad segment", p, NULL); - return; - } - linkp = p->link; - if (p->type == TEXTTYPE) - KillText(p); - else - Free(p); - p = linkp; - } -} - -/* -:h2 id=location."location" Objects - -The TYPE1IMAGER user creates and destroys objects of type "location". These -objects locate points for the primitive path operators. We play a trick -here and store these objects in the same "segment" structure used for -paths, with a type field == MOVETYPE. - -This allows the Line() operator, for example, to be very trivial: -It merely stamps its input structure as a LINETYPE and returns it to the -caller--assuming, of course, the input structure was not permanent (as -it usually isn't). - -:h3.The "movesegment" Template Structure - -This template is used as a generic segment structure for Allocate: -*/ - -/* added reference field 1 to temporary template below 3-26-91 PNM */ -static struct segment movetemplate = { MOVETYPE, 0, 1, sizeof(struct segment), 0, - NULL, NULL, {0, 0} }; -/* -:h3.Loc() - Create an "Invisible Line" Between (0,0) and a Point - -*/ - -struct segment * -t1_Loc(struct XYspace *S, /* coordinate space to interpret X,Y */ - double x, double y) /* destination point */ -{ - register struct segment *r; - - - r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); - TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); - - r->last = r; - r->context = S->context; - (*S->convert)(&r->dest, S, x, y); - ConsumeSpace(S); - return(r); -} -/* -:h3.ILoc() - Loc() With Integer Arguments - -*/ -struct segment * -ILoc(struct XYspace *S, /* coordinate space to interpret X,Y */ - int x, int y) /* destination point */ -{ - register struct segment *r; - - r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); - TYPECHECK("Loc", S, SPACETYPE, r, (0), struct segment *); - - r->last = r; - r->context = S->context; - (*S->iconvert)(&r->dest, S, (long) x, (long) y); - ConsumeSpace(S); - return(r); -} - -/* -:h3.SubLoc() - Vector Subtraction of Two Locition Objects - -This user operator subtracts two location objects, yielding a new -location object that is the result. - -The symmetrical function AddLoc() is totally redundent with Join(), -so it is not provided. -*/ - -struct segment * -SubLoc(struct segment *p1, struct segment *p2) -{ - ARGCHECK(!ISLOCATION(p1), "SubLoc: bad first arg", p1, NULL, (0), struct segment *); - ARGCHECK(!ISLOCATION(p2), "SubLoc: bad second arg", p2, NULL, (0), struct segment *); - p1 = UniquePath(p1); - p1->dest.x -= p2->dest.x; - p1->dest.y -= p2->dest.y; - ConsumePath(p2); - return(p1); -} - -/* -:h2.Straight Line Segments - -:h3.PathSegment() - Create a Generic Path Segment - -Many routines need a LINETYPE or MOVETYPE path segment, but do not -want to go through the external user's interface, because, for example, -they already know the "fractpel" destination of the segment and the -conversion is unnecessary. PathSegment() is an internal routine -provided to the rest of TYPE1IMAGER for handling these cases. -*/ - -struct segment * -t1_PathSegment(int type, /* LINETYPE or MOVETYPE */ - fractpel x, fractpel y) /* where to go to, if known */ -{ - register struct segment *r; /* newly created segment */ - - r = (struct segment *)Allocate(sizeof(struct segment), &movetemplate, 0); - r->type = type; - r->last = r; /* last points to itself for singleton */ - r->dest.x = x; - r->dest.y = y; - return(r); -} -/* -:h3.Line() - Create a Line Segment Between (0,0) and a Point P - -This involves just creating and filling out a segment structure: -*/ -struct segment * -Line(struct segment *P) /* relevant coordinate space */ -{ - ARGCHECK(!ISLOCATION(P), "Line: arg not a location", P, NULL, (0), struct segment *); - - P = UniquePath(P); - P->type = LINETYPE; - return(P); -} -/* -:h2.Curved Path Segments - -We need more points to describe curves. So, the structures for curved -path segments are slightly different. The first part is identical; -the curved structures are larger with the extra points on the end. - -:h3.Bezier Segment Structure - -We support third order Bezier curves. They are specified with four -control points A, B, C, and D. The curve starts at A with slope AB -and ends at D with slope CD. The curvature at the point A is inversely -related to the length |AB|, and the curvature at the point D is -inversely related to the length |CD|. Point A is always point (0,0). - -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Bezier() - Generate a Bezier Segment - -This is just a simple matter of filling out a 'beziersegment' structure: -*/ - -struct beziersegment * -Bezier(struct segment *B, /* second control point */ - struct segment *C, /* third control point */ - struct segment *D) /* fourth control point (ending point) */ -{ -/* added reference field of 1 to temporary template below 3-26-91 PNM */ - static struct beziersegment template = - { BEZIERTYPE, 0, 1, sizeof(struct beziersegment), 0, - NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 } }; - - register struct beziersegment *r; /* output segment */ - - ARGCHECK(!ISLOCATION(B), "Bezier: bad B", B, NULL, (2,C,D), struct beziersegment *); - ARGCHECK(!ISLOCATION(C), "Bezier: bad C", C, NULL, (2,B,D), struct beziersegment *); - ARGCHECK(!ISLOCATION(D), "Bezier: bad D", D, NULL, (2,B,C), struct beziersegment *); - - r = (struct beziersegment *)Allocate(sizeof(struct beziersegment), &template, 0); - r->last = (struct segment *) r; - r->dest.x = D->dest.x; - r->dest.y = D->dest.y; - r->B.x = B->dest.x; - r->B.y = B->dest.y; - r->C.x = C->dest.x; - r->C.y = C->dest.y; - - ConsumePath(B); - ConsumePath(C); - ConsumePath(D); - return(r); -} - -/* -:h2.Font "Hint" Segments - -:h3.Hint() - A Font 'Hint' Segment - -This is temporary code while we experiment with hints. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -struct hintsegment * -Hint(struct XYspace *S, float ref, float width, - char orientation, char hinttype, char adjusttype, char direction, - int label) -{ -/* added reference field of 1 to hintsegment template below 3-26-91 PNM */ - static struct hintsegment template = { HINTTYPE, 0, 1, sizeof(struct hintsegment), 0, - NULL, NULL, { 0, 0 }, { 0, 0 }, { 0, 0 }, - ' ', ' ', ' ', ' ', 0}; - - register struct hintsegment *r; - - r = (struct hintsegment *)Allocate(sizeof(struct hintsegment), &template, 0); - - r->orientation = orientation; - if (width == 0.0) width = 1.0; - - if (orientation == 'h') { - (*S->convert)(&r->ref, S, 0.0, ref); - (*S->convert)(&r->width, S, 0.0, width); - } - else if (orientation == 'v') { - (*S->convert)(&r->ref, S, ref, 0.0); - (*S->convert)(&r->width, S, width, 0.0); - } - else - return((struct hintsegment *)ArgErr("Hint: orient not 'h' or 'v'", NULL, NULL)); - if (r->width.x < 0) r->width.x = - r->width.x; - if (r->width.y < 0) r->width.y = - r->width.y; - r->hinttype = hinttype; - r->adjusttype = adjusttype; - r->direction = direction; - r->label = label; - r->last = (struct segment *) r; - ConsumeSpace(S); - return(r); -} - -/* -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -POP removes the first segment in a path 'p' and Frees it. 'p' is left -pointing to the end of the path: -*/ -#define POP(p) \ - { register struct segment *linkp; \ - linkp = p->link; \ - if (linkp != NULL) \ - linkp->last = p->last; \ - Free(p); \ - p = linkp; } -/* -INSERT inserts a single segment in the middle of a chain. 'b' is -the segment before, 'p' the segment to be inserted, and 'a' the -segment after. -*/ -#define INSERT(b,p,a) b->link=p; p->link=a; p->last=NULL - -/* -:h3.Join() - Join Two Objects Together - -If these are paths, this operator simply invokes the CONCAT macro. -Why so much code then, you ask? Well we have to check for object -types other than paths, and also check for certain path consistency -rules. -*/ - -struct segment * -Join(struct segment *p1, struct segment *p2) -{ -/* -We start with a whole bunch of very straightforward argument tests: -*/ - if (p2 != NULL) { - if (!ISPATHTYPE(p2->type)) { - - if (p1 == NULL) - return((struct segment *)Unique(p2)); - - switch (p1->type) { - - case REGIONTYPE: - - case STROKEPATHTYPE: - p1 = CoercePath(p1); - break; - - default: - return((struct segment *)BegHandle(p1, p2)); - } - } - - ARGCHECK((p2->last == NULL), "Join: right arg not anchor", p2, NULL, (1,p1), struct segment *); - p2 = UniquePath(p2); - -/* -In certain circumstances, we don't have to duplicate a permanent -location. (We would just end up destroying it anyway). These cases -are when 'p2' begins with a move-type segment: -*/ - if (p2->type == TEXTTYPE || p2->type == MOVETYPE) { - if (p1 == NULL) - return(p2); - if (ISLOCATION(p1)) { - p2->dest.x += p1->dest.x; - p2->dest.y += p1->dest.y; - ConsumePath(p1); - return(p2); - } - } - } - else - return((struct segment *)Unique(p1)); - - if (p1 != NULL) { - if (!ISPATHTYPE(p1->type)) - - switch (p2->type) { - - case REGIONTYPE: - - case STROKEPATHTYPE: - p2 = CoercePath(p2); - break; - - default: - return((struct segment *)EndHandle(p1, p2)); - } - - ARGCHECK((p1->last == NULL), "Join: left arg not anchor", p1, NULL, (1,p2), struct segment *); - p1 = UniquePath(p1); - } - else - return(p2); - -/* -At this point all the checking is done. We have two temporary non-null -path types in 'p1' and 'p2'. If p1 ends with a MOVE, and p2 begins with -a MOVE, we collapse the two MOVEs into one. We enforce the rule that -there may not be two MOVEs in a row: -*/ - - if (p1->last->type == MOVETYPE && p2->type == MOVETYPE) { - p1->last->flag |= p2->flag; - p1->last->dest.x += p2->dest.x; - p1->last->dest.y += p2->dest.y; - POP(p2); - if (p2 == NULL) - return(p1); - } -/* -Now we check for another silly rule. If a path has any TEXTTYPEs, -then it must have only TEXTTYPEs and MOVETYPEs, and furthermore, -it must begin with a TEXTTYPE. This rule makes it easy to check -for the special case of text. If necessary, we will coerce -TEXTTYPEs into paths so we don't mix TEXTTYPEs with normal paths. -*/ - if (p1->type == TEXTTYPE) { - if (p2->type != TEXTTYPE && !ISLOCATION(p2)) - p1 = CoerceText(p1); - } - else { - if (p2->type == TEXTTYPE) { - if (ISLOCATION(p1)) { - p2->dest.x += p1->dest.x; - p2->dest.y += p1->dest.y; - Free(p1); - return(p2); - } - else - p2 = CoerceText(p2); - } - } -/* -Thank God! Finally! It's hard to believe, but we are now able to -actually do the join. This is just invoking the CONCAT macro: -*/ - CONCAT(p1, p2); - - return(p1); -} - -/* -:h3.JoinSegment() - Create a Path Segment and Join It to a Known Path - -This internal function is quicker than a full-fledged join because -it can do much less checking. -*/ - -struct segment * -t1_JoinSegment(struct segment *before, /* path to join before new segment */ - int type, /* type of new segment (MOVETYPE or LINETYPE) */ - fractpel x, fractpel y, /* x,y of new segment */ - struct segment *after) /* path to join after new segment */ -{ - register struct segment *r; /* returned path built here */ - - r = PathSegment(type, x, y); - if (before != NULL) { - CONCAT(before, r); - r = before; - } - else - r->context = after->context; - if (after != NULL) - CONCAT(r, after); - return(r); -} - -/* -:h2.Other Path Functions - -*/ - - -struct segment * -t1_ClosePath(struct segment *p0, /* path to close */ - int lastonly) /* flag deciding to close all subpaths or... */ -{ - register struct segment *p,*last = NULL,*start; /* used in looping through path */ - register fractpel x,y; /* current position in path */ - register fractpel firstx = 0,firsty = 0; /* start position of sub path */ - register struct segment *lastnonhint = NULL; /* last non-hint segment in path */ - - if (p0 != NULL && p0->type == TEXTTYPE) - return(UniquePath(p0)); - if (p0->type == STROKEPATHTYPE) - return((struct segment *)Unique(p0)); - /* - * NOTE: a null closed path is different from a null open path - * and is denoted by a closed (0,0) move segment. We make - * sure this path begins and ends with a MOVETYPE: - */ - if (p0 == NULL || p0->type != MOVETYPE) - p0 = JoinSegment(NULL, MOVETYPE, 0, 0, p0); - TYPECHECK("ClosePath", p0, MOVETYPE, NULL, (0), struct segment *); - if (p0->last->type != MOVETYPE) - p0 = JoinSegment(p0, MOVETYPE, 0, 0, NULL); - - p0 = UniquePath(p0); - -/* -We now begin a loop through the path, -incrementing current 'x' and 'y'. We are searching -for MOVETYPE segments (breaks in the path) that are not already closed. -At each break, we insert a close segment. -*/ - for (p = p0, x = y = 0, start = NULL; - p != NULL; - x += p->dest.x, y += p->dest.y, last = p, p = p->link) - { - - if (p->type == MOVETYPE) { - if (start != NULL && (lastonly?p->link==NULL:TRUE) && - !(ISCLOSED(start->flag) && LASTCLOSED(last->flag))) { - register struct segment *r; /* newly created */ - - start->flag |= ISCLOSED(ON); - r = PathSegment(LINETYPE, firstx - x, - firsty - y); - INSERT(last, r, p); - r->flag |= LASTCLOSED(ON); - /*< adjust 'last' if possible for a 0,0 close >*/ -{ - -#define CLOSEFUDGE 3 /* if we are this close, let's change last segment */ - - if (r->dest.x != 0 || r->dest.y != 0) { - if (r->dest.x <= CLOSEFUDGE && r->dest.x >= -CLOSEFUDGE - && r->dest.y <= CLOSEFUDGE && r->dest.y >= -CLOSEFUDGE) { - lastnonhint->dest.x += r->dest.x; - lastnonhint->dest.y += r->dest.y; - r->dest.x = r->dest.y = 0; - } - } -} - if (p->link != NULL) { - p->dest.x += x - firstx; - p->dest.y += y - firsty; - x = firstx; - y = firsty; - } - } - start = p; - firstx = x + p->dest.x; - firsty = y + p->dest.y; - } - else if (p->type != HINTTYPE) - lastnonhint = p; - } - return(p0); -} -/* -*/ -/* -:h2.Reversing the Direction of a Path - -This turned out to be more difficult than I thought at first. The -trickiness was due to the fact that closed paths must remain closed, -etc. - -We need three subroutines: -*/ - -/* break a path at any point */ -static struct segment *SplitPath ( struct segment *anchor, - struct segment *before ); -/* breaks a path after first sub-path */ -static struct segment *DropSubPath ( struct segment *p0 ); -/* reverses a single sub-path */ -static struct segment *ReverseSubPath ( struct segment *p ); - -/* -:h3.Reverse() - User Operator to Reverse a Path - -This operator reverses the entire path. -*/ - -struct segment * -Reverse(struct segment *p) /* full path to reverse */ -{ - register struct segment *r; /* output path built here */ - register struct segment *nextp; /* contains next sub-path */ - - if (p == NULL) - return(NULL); - - ARGCHECK(!ISPATHANCHOR(p), "Reverse: invalid path", p, NULL, (0), struct segment *); - - if (p->type == TEXTTYPE) - p = CoerceText(p); - p = UniquePath(p); - - r = NULL; - - do { - nextp = DropSubPath(p); - p = ReverseSubPath(p); - r = Join(p, r); - p = nextp; - - } while (p != NULL); - - return(r); -} - -/* -:h4.ReverseSubPath() - Subroutine to Reverse a Single Sub-Path -*/ - -static struct segment * -ReverseSubPath(struct segment *p) /* input path */ -{ - register struct segment *r; /* reversed path will be created here */ - register struct segment *nextp; /* temporary variable used in loop */ - register int wasclosed; /* flag, path was closed */ - - if (p == NULL) - return(NULL); - - wasclosed = ISCLOSED(p->flag); - r = NULL; - - do { -/* -First we reverse the direction of this segment and clean up its flags: -*/ - p->dest.x = - p->dest.x; p->dest.y = - p->dest.y; - p->flag &= ~(ISCLOSED(ON) | LASTCLOSED(ON)); - - switch (p->type) { - - case LINETYPE: - case MOVETYPE: - break; - - case CONICTYPE: - { -/* -The logic of this is that the new M point (stored relative to the new -beginning) is (M - C). However, C ("dest") has already been reversed -So, we add "dest" instead of subtracting it: -*/ - register struct conicsegment *cp = (struct conicsegment *) p; - - cp->M.x += cp->dest.x; cp->M.y += cp->dest.y; - } - break; - - case BEZIERTYPE: - { - register struct beziersegment *bp = (struct beziersegment *) p; - - bp->B.x += bp->dest.x; bp->B.y += bp->dest.y; - bp->C.x += bp->dest.x; bp->C.y += bp->dest.y; - } - break; - - case HINTTYPE: - { - register struct hintsegment *hp = (struct hintsegment *) p; - - hp->ref.x = -hp->ref.x; hp->ref.y = -hp->ref.y; - } - break; - - default: - Abort("Reverse: bad path segment"); - } -/* -We need to reverse the order of segments too, so we break this segment -off of the input path, and tack it on the front of the growing path -in 'r': -*/ - nextp = p->link; - p->link = NULL; - p->last = p; - if (r != NULL) - CONCAT(p,r); /* leaves result in 'p'... not what we want */ - r = p; - p = nextp; /* advance to next segment in input path */ - - } while (p != NULL); - - if (wasclosed) - r = ClosePath(r); - - return(r); -} - -/* -:h4.DropSubPath() - Drops the First Sub-Path Off a Path - -This subroutine returns the remaining sub-path(s). While doing so, it -breaks the input path after the first sub-path so that a pointer to -the original path now contains the first sub-path only. -*/ - -static struct segment * -DropSubPath(struct segment *p0) /* original path */ -{ - register struct segment *p; /* returned remainder here */ - - for (p = p0; p->link != NULL; p = p->link) { - if (p->link->type == MOVETYPE) - break; - } - - return(SplitPath(p0, p)); -} - -static struct segment * -SplitPath(struct segment *anchor, struct segment *before) -{ - register struct segment *r; - - if (before == anchor->last) - return(NULL); - - r = before->link; - r->last = anchor->last; - anchor->last = before; - before->link = NULL; - - return(r); -} - -static void -UnClose(struct segment *p0) -{ - register struct segment *p; - - for (p=p0; p->link->link != NULL; p=p->link) { ; } - - if (!LASTCLOSED(p->link->flag)) - Abort("UnClose: no LASTCLOSED"); - - Free(SplitPath(p0, p)); - p0->flag &= ~ISCLOSED(ON); -} - -/* -:h3.ReverseSubPaths() - Reverse the Direction of Sub-paths Within a Path - -This user operator reverses the sub-paths in a path, but leaves the -'move' segments unchanged. It builds on top of the subroutines -already established. -*/ - -struct segment * -ReverseSubPaths(struct segment *p) /* input path */ -{ - register struct segment *r; /* reversed path will be created here */ - register struct segment *nextp; /* temporary variable used in loop */ - int wasclosed; /* flag; subpath was closed */ - register struct segment *nomove; /* the part of sub-path without move segment */ - struct fractpoint delta; - - if (p == NULL) - return(NULL); - - ARGCHECK(!ISPATHANCHOR(p), "ReverseSubPaths: invalid path", p, NULL, (0), struct segment *); - - if (p->type == TEXTTYPE) - p = CoerceText(p); - if (p->type != MOVETYPE) - p = JoinSegment(NULL, MOVETYPE, 0, 0, p); - - p = UniquePath(p); - - r = NULL; - - for (; p != NULL;) { - nextp = DropSubPath(p); - wasclosed = ISCLOSED(p->flag); - if (wasclosed) - UnClose(p); - - nomove = SplitPath(p, p); - r = Join(r, p); - - PathDelta(nomove, &delta); - - nomove = ReverseSubPath(nomove); - p->dest.x += delta.x; - p->dest.y += delta.y; - if (nextp != NULL) { - nextp->dest.x += delta.x; - nextp->dest.y += delta.y; - } - if (wasclosed) { - nomove = ClosePath(nomove); - nextp->dest.x -= delta.x; - nextp->dest.y -= delta.y; - } - r = Join(r, nomove); - p = nextp; - - } - - return(r); -} - -/* -:h2.Transforming and Putting Handles on Paths - -:h3.PathTransform() - Transform a Path - -Transforming a path involves transforming all the points. In order -that closed paths do not become "unclosed" when their relative -positions are slightly changed due to loss of arithmetic precision, -all point transformations are in absolute coordinates. - -(It might be better to reset the "absolute" coordinates every time a -move segment is encountered. This would mean that we could accumulate -error from subpath to subpath, but we would be less likely to make -the "big error" where our fixed point arithmetic "wraps". However, I -think I'll keep it this way until something happens to convince me -otherwise.) - -The transform is described as a "space", that way we can use our -old friend the "iconvert" function, which should be very efficient. -*/ - -struct segment * -PathTransform(struct segment *p0, /* path to transform */ - struct XYspace *S) /* pseudo space to transform in */ -{ - register struct segment *p; /* to loop through path with */ - register fractpel newx,newy; /* current transformed position in path */ - register fractpel oldx,oldy; /* current untransformed position in path */ - register fractpel savex,savey; /* save path delta x,y */ - - p0 = UniquePath(p0); - - newx = newy = oldx = oldy = 0; - - for (p=p0; p != NULL; p=p->link) { - - savex = p->dest.x; savey = p->dest.y; - - (*S->iconvert)(&p->dest, S, p->dest.x + oldx, p->dest.y + oldy); - p->dest.x -= newx; - p->dest.y -= newy; - - switch (p->type) { - - case LINETYPE: - case MOVETYPE: - break; - - case CONICTYPE: - { - register struct conicsegment *cp = (struct conicsegment *) p; - - (*S->iconvert)(&cp->M, S, cp->M.x + oldx, cp->M.y + oldy); - cp->M.x -= newx; - cp->M.y -= newy; - /* - * Note roundness doesn't change... linear transform - */ - break; - } - - - case BEZIERTYPE: - { - register struct beziersegment *bp = (struct beziersegment *) p; - - (*S->iconvert)(&bp->B, S, bp->B.x + oldx, bp->B.y + oldy); - bp->B.x -= newx; - bp->B.y -= newy; - (*S->iconvert)(&bp->C, S, bp->C.x + oldx, bp->C.y + oldy); - bp->C.x -= newx; - bp->C.y -= newy; - break; - } - - case HINTTYPE: - { - register struct hintsegment *hp = (struct hintsegment *) p; - - (*S->iconvert)(&hp->ref, S, hp->ref.x + oldx, hp->ref.y + oldy); - hp->ref.x -= newx; - hp->ref.y -= newy; - (*S->iconvert)(&hp->width, S, hp->width.x, hp->width.y); - /* Note: width is not relative to origin */ - break; - } - - case TEXTTYPE: - { - XformText(p,S); - break; - } - - default: - Abort("PathTransform: invalid segment"); - } - oldx += savex; - oldy += savey; - newx += p->dest.x; - newy += p->dest.y; - } - return(p0); -} - -/* -:h3.PathDelta() - Return a Path's Ending Point -*/ - -void -PathDelta(struct segment *p, /* input path */ - struct fractpoint *pt) /* pointer to x,y to set */ -{ - struct fractpoint mypoint; /* I pass this to TextDelta */ - register fractpel x,y; /* working variables for path current point */ - - for (x=y=0; p != NULL; p=p->link) { - x += p->dest.x; - y += p->dest.y; - if (p->type == TEXTTYPE) { - TextDelta(p, &mypoint); - x += mypoint.x; - y += mypoint.y; - } - } - - pt->x = x; - pt->y = y; -} - -/* -:h3.BoundingBox() - Produce a Bounding Box Path - -This function is called by image code, when we know the size of the -image in pels, and need to get a bounding box path that surrounds it. -The starting/ending handle is in the lower right hand corner. -*/ -struct segment * -BoundingBox(pel h, pel w) /* size of box */ -{ - register struct segment *path; - - path = PathSegment(LINETYPE, -TOFRACTPEL(w), 0); - path = JoinSegment(NULL, LINETYPE, 0, -TOFRACTPEL(h), path); - path = JoinSegment(NULL, LINETYPE, TOFRACTPEL(w), 0, path); - path = ClosePath(path); - - return(path); -} - -/* -:h2.Querying Locations and Paths - -:h3.QueryLoc() - Return the X,Y of a Locition -*/ - -void -QueryLoc(struct segment *P, /* location to query, not consumed */ - struct XYspace *S, /* XY space to return coordinates in */ - double *xP, double *yP) /* coordinates returned here */ -{ - if (!ISLOCATION(P)) { - ArgErr("QueryLoc: first arg not a location", P, NULL); - return; - } - if (S->type != SPACETYPE) { - ArgErr("QueryLoc: second arg not a space", S, NULL); - return; - } - UnConvert(S, &P->dest, xP, yP); -} -/* -:h3.QueryPath() - Find Out the Type of Segment at the Head of a Path - -This is a very simple routine that looks at the first segment of a -path and tells the caller what it is, as well as returning the control -point(s) of the path segment. Different path segments have different -number of control points. If the caller knows that the segment is -a move segment, for example, he only needs to pass pointers to return -one control point. -*/ - -void -QueryPath(struct segment *path, /* path to check */ - int *typeP, /* return the type of path here */ - struct segment **Bp, /* return location of first point */ - struct segment **Cp, /* return location of second point */ - struct segment **Dp, /* return location of third point */ - double *fP) /* return Conic sharpness */ -{ - register int coerced = FALSE; /* did I coerce a text path? */ - - if (path == NULL) { - *typeP = -1; - return; - } - if (!ISPATHANCHOR(path)) { - ArgErr("QueryPath: arg not a valid path", path, NULL); - } - if (path->type == TEXTTYPE) { - path = CoerceText(path); - coerced = TRUE; - } - - switch (path->type) { - - case MOVETYPE: - *typeP = 0; - *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); - break; - - case LINETYPE: - *typeP = (LASTCLOSED(path->flag)) ? 4 : 1; - *Bp = PathSegment(MOVETYPE, path->dest.x, path->dest.y); - break; - - case CONICTYPE: - { - register struct conicsegment *cp = (struct conicsegment *) path; - - *typeP = 2; - *Bp = PathSegment(MOVETYPE, cp->M.x, cp->M.y); - *Cp = PathSegment(MOVETYPE, cp->dest.x, cp->dest.y); - *fP = cp->roundness; - } - break; - - case BEZIERTYPE: - { - register struct beziersegment *bp = (struct beziersegment *) path; - - *typeP = 3; - *Bp = PathSegment(MOVETYPE, bp->B.x, bp->B.y); - *Cp = PathSegment(MOVETYPE, bp->C.x, bp->C.y); - *Dp = PathSegment(MOVETYPE, bp->dest.x, bp->dest.y); - } - break; - - case HINTTYPE: - *typeP = 5; - break; - - default: - Abort("QueryPath: unknown segment"); - } - if (coerced) - KillPath(path); -} -/* -:h3.QueryBounds() - Return the Bounding Box of a Path - -Returns the bounding box by setting the user's variables. -*/ - -void -QueryBounds(struct segment *p0, /* object to check for bound */ - struct XYspace *S, /* coordinate space of returned values */ - double *xminP, /* lower left hand corner (set by routine) */ - double *yminP, - double *xmaxP, /* upper right hand corner (set by routine) */ - double *ymaxP) -{ - register struct segment *path; /* loop variable for path segments */ - register fractpel lastx,lasty; /* loop variables: previous endingpoint */ - register fractpel x,y; /* loop variables: current ending point */ - struct fractpoint min; /* registers to keep lower left hand corner */ - struct fractpoint max; /* registers to keep upper right hand corner */ - int coerced = FALSE; /* we have coerced the path from another object */ - double x1,y1,x2,y2,x3,y3,x4,y4; /* corners of rectangle in space X */ - - if (S->type != SPACETYPE) { - ArgErr("QueryBounds: bad XYspace", S, NULL); - return; - } - - min.x = min.y = max.x = max.y = 0; - if (p0 != NULL) { - if (!ISPATHANCHOR(p0)) { - switch(p0->type) { - case STROKEPATHTYPE: - /* replaced DupStrokePath() with Dup() 3-26-91 PNM */ - p0 = (struct segment *) DoStroke(Dup(p0)); - /* no break here, we have a region in p0 */ - case REGIONTYPE: - p0 = RegionBounds((struct region *)p0); - break; - - case PICTURETYPE: - p0 = PictureBounds(p0); - break; - - default: - ArgErr("QueryBounds: bad object", p0, NULL); - return; - } - coerced = TRUE; - } - if (p0->type == TEXTTYPE) { - /* replaced CopyPath() with Dup() 3-26-91 PNM */ - p0 = (struct segment *)CoerceText(Dup(p0)); /* there are faster ways */ - coerced = TRUE; - } - if (p0->type == MOVETYPE) { - min.x = max.x = p0->dest.x; - min.y = max.y = p0->dest.y; - } - } - lastx = lasty = 0; - - for (path = p0; path != NULL; path = path->link) { - - x = lastx + path->dest.x; - y = lasty + path->dest.y; - - switch (path->type) { - - case LINETYPE: - break; - - case CONICTYPE: - { - register struct conicsegment *cp = (struct conicsegment *) path; - register fractpel Mx = lastx + cp->M.x; - register fractpel My = lasty + cp->M.y; - register fractpel deltax = 0.5 * cp->roundness * cp->dest.x; - register fractpel deltay = 0.5 * cp->roundness * cp->dest.y; - register fractpel Px = Mx - deltax; - register fractpel Py = My - deltay; - register fractpel Qx = Mx + deltax; - register fractpel Qy = My + deltay; - - - if (Mx < min.x) min.x = Mx; - else if (Mx > max.x) max.x = Mx; - if (My < min.y) min.y = My; - else if (My > max.y) max.y = My; - - if (Px < min.x) min.x = Px; - else if (Px > max.x) max.x = Px; - if (Py < min.y) min.y = Py; - else if (Py > max.y) max.y = Py; - - if (Qx < min.x) min.x = Qx; - else if (Qx > max.x) max.x = Qx; - if (Qy < min.y) min.y = Qy; - else if (Qy > max.y) max.y = Qy; - } - break; - - - case MOVETYPE: - /* - * We can't risk adding trailing Moves to the - * bounding box: - */ - if (path->link == NULL) - goto done; /* God forgive me */ - break; - - case BEZIERTYPE: - { - register struct beziersegment *bp = (struct beziersegment *) path; - register fractpel Bx = lastx + bp->B.x; - register fractpel By = lasty + bp->B.y; - register fractpel Cx = lastx + bp->C.x; - register fractpel Cy = lasty + bp->C.y; - - if (Bx < min.x) min.x = Bx; - else if (Bx > max.x) max.x = Bx; - if (By < min.y) min.y = By; - else if (By > max.y) max.y = By; - - if (Cx < min.x) min.x = Cx; - else if (Cx > max.x) max.x = Cx; - if (Cy < min.y) min.y = Cy; - else if (Cy > max.y) max.y = Cy; - } - break; - - case HINTTYPE: - break; - default: - Abort("QueryBounds: unknown type"); - } - - if (x < min.x) min.x = x; - else if (x > max.x) max.x = x; - if (y < min.y) min.y = y; - else if (y > max.y) max.y = y; - - lastx = x; lasty = y; - } -done: - UnConvert(S, &min, &x1, &y1); - UnConvert(S, &max, &x4, &y4); - x = min.x; min.x = max.x; max.x = x; - UnConvert(S, &min, &x2, &y2); - UnConvert(S, &max, &x3, &y3); - - *xminP = *xmaxP = x1; - if (x2 < *xminP) *xminP = x2; - else if (x2 > *xmaxP) *xmaxP = x2; - if (x3 < *xminP) *xminP = x3; - else if (x3 > *xmaxP) *xmaxP = x3; - if (x4 < *xminP) *xminP = x4; - else if (x4 > *xmaxP) *xmaxP = x4; - - *yminP = *ymaxP = y1; - if (y2 < *yminP) *yminP = y2; - else if (y2 > *ymaxP) *ymaxP = y2; - if (y3 < *yminP) *yminP = y3; - else if (y3 > *ymaxP) *ymaxP = y3; - if (y4 < *yminP) *yminP = y4; - else if (y4 > *ymaxP) *ymaxP = y4; - - if (coerced) - Destroy(p0); -} -/* -:h3.BoxPath() -*/ -struct segment * -BoxPath(struct XYspace *S, int h, int w) -{ - struct segment *path; - - path = Join( Line(ILoc(S, w, 0)), Line(ILoc(S, 0, h)) ); - path = JoinSegment(path, LINETYPE, -path->dest.x, -path->dest.y, NULL); - return(ClosePath(path)); -} - -/* -:h3.DropSegment() - Drop the First Segment in a Path - -This routine takes the path and returns a new path that is one segment -shorter. It can be used in conjunction with QueryPath(), for example, -to ask about an entire path. -*/ - -struct segment * -DropSegment(struct segment *path) -{ - if (path != NULL && path->type == STROKEPATHTYPE) - path = CoercePath(path); - ARGCHECK((path == NULL || !ISPATHANCHOR(path)), - "DropSegment: arg not a non-null path", path, path, (0), struct segment *); - if (path->type == TEXTTYPE) - path = CoerceText(path); - path = UniquePath(path); - - POP(path); - return(path); -} -/* -:h3.HeadSegment() - Return the First Segment in a Path - -This routine takes the path and returns a new path consists of the -first segment only. -*/ - -struct segment * -HeadSegment(struct segment *path) /* input path */ -{ - if (path == NULL) - return(NULL); - if (path->type == STROKEPATHTYPE) - path = CoercePath(path); - ARGCHECK(!ISPATHANCHOR(path), "HeadSegment: arg not a path", path, path, (0), struct segment *); - if (path->type == TEXTTYPE) - path = CoerceText(path); - path = UniquePath(path); - - if (path->link != NULL) - KillPath(path->link); - path->link = NULL; - path->last = path; - return(path); -} - -/* -:h2.Path Debug Routines - -:h3.DumpPath() - Display a Path on the Trace File -*/ - -void -DumpPath(struct segment *p) -{ -} diff --git a/nx-X11/lib/font/Type1/paths.h b/nx-X11/lib/font/Type1/paths.h deleted file mode 100644 index b61275b9c..000000000 --- a/nx-X11/lib/font/Type1/paths.h +++ /dev/null @@ -1,239 +0,0 @@ -/* $Xorg: paths.h,v 1.3 2000/08/17 19:46:31 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/paths.h,v 1.3 1999/08/22 08:58:53 dawes Exp $ */ - -/*SHARED*/ - -#define Loc(S,x,y) t1_Loc(S,(double)x,(double)y) -#define ILoc(S,x,y) t1_ILoc(S,x,y) -#define Line(P) t1_Line(P) -#define Join(p1,p2) t1_Join(p1,p2) -#define ClosePath(p) t1_ClosePath(p,0) -#define CloseLastSubPath(p) t1_ClosePath(p,1) -#define Conic(B,C,s) t1_Conic(B,C,(double)s) -#define RoundConic(M,C,r) t1_RoundConic(M,C,(double)r) -#define ArcP3(S,P2,P3) t1_ArcP3(S,P2,P3) -#define ArcCA(S,C,d) t1_ArcCA(S,C,(double)d) -#define Bezier(B,C,D) t1_Bezier(B,C,D) -#define Hint(S,r,w,o,h,a,d,l) t1_Hint(S,r,w,o,h,a,d,l) -#define Reverse(p) t1_Reverse(p) -#define ReverseSubPaths(p) t1_ReverseSubPaths(p) -#define AddLoc(p1,p2) t1_Join(p1,p2) -#define SubLoc(p1,p2) t1_SubLoc(p1,p2) -#define DropSegment(p) t1_DropSegment(p) -#define HeadSegment(p) t1_HeadSegment(p) -#define QueryLoc(P,S,x,y) t1_QueryLoc(P,S,x,y) -#define QueryPath(p,t,B,C,D,r) t1_QueryPath(p,t,B,C,D,r) -#define QueryBounds(p,S,x1,y1,x2,y2) t1_QueryBounds(p,S,x1,y1,x2,y2) - - -/* create a location object (or "move" segment) */ -extern struct segment *t1_Loc ( struct XYspace *S, double x, double y ); -/* integer argument version of same */ -extern struct segment *t1_ILoc ( struct XYspace *S, int x, int y ); -/* straight line path segment */ -extern struct segment *t1_Line ( struct segment *P ); -/* join two paths or regions together */ -extern struct segment *t1_Join ( struct segment *p1, struct segment *p2 ); -/* close a path or path set */ -extern struct segment *t1_ClosePath ( struct segment *p0, int lastonly ); -#if 0 -struct conicsegment *t1_Conic(); /* conic curve path segment */ - -struct conicsegment *t1_RoundConic(); /* ditto, specified another way */ -struct conicsegment *t1_ArcP3(); /* circular path segment with three points */ -struct conicsegment *t1_ArcCA(); /* ditto, with center point and angle */ -#endif -/* Bezier third order curve path segment */ -extern struct beziersegment *t1_Bezier ( struct segment *B, struct segment *C, - struct segment *D ); -/* produce a font 'hint' path segment */ -extern struct hintsegment *t1_Hint ( struct XYspace *S, float ref, float width, - char orientation, char hinttype, - char adjusttype, char direction, - int label ); -/* reverse the complete order of paths */ -extern struct segment *t1_Reverse ( struct segment *p ); -/* reverse only sub-paths; moves unchanged */ -extern struct segment *t1_ReverseSubPaths ( struct segment *p ); -/* subtract two location objects */ -extern struct segment *t1_SubLoc ( struct segment *p1, struct segment *p2 ); -/* Drop the first segment in a path */ -extern struct segment *t1_DropSegment ( struct segment *path ); -/* return the first segment in a path */ -extern struct segment *t1_HeadSegment ( struct segment *path ); -/* Query location; return its (x,y) */ -extern void t1_QueryLoc ( struct segment *P, struct XYspace *S, double *xP, - double *yP ); -/* Query segment at head of a path */ -extern void t1_QueryPath ( struct segment *path, int *typeP, - struct segment **Bp, struct segment **Cp, - struct segment **Dp, double *fP ); -/* Query the bounding box of a path */ -extern void t1_QueryBounds ( struct segment *p0, struct XYspace *S, - double *xminP, double *yminP, - double *xmaxP, double *ymaxP ); - -/*END SHARED*/ -/*SHARED*/ - -#define CopyPath(p) t1_CopyPath(p) -#define KillPath(p) t1_KillPath(p) -#define PathTransform(p,m) t1_PathXform(p,m) -#define PathDelta(p,pt) t1_PathDelta(p,pt) -#define BoundingBox(h,w) t1_BoundingBox(h,w) -#define PathSegment(t,x,y) t1_PathSegment(t,(fractpel)x,(fractpel)y) -#define JoinSegment(b,t,x,y,a) t1_JoinSegment(b,t,(fractpel)x,(fractpel)y,a) -#define Hypoteneuse(dx,dy) t1_Hypoteneuse(dx,dy) -#define BoxPath(S,h,w) t1_BoxPath(S,h,w) - -/* duplicate a path */ -extern struct segment *t1_CopyPath ( struct segment *p0 ); -/* destroy a path */ -extern void t1_KillPath ( struct segment *p ); -/* transform a path arbitrarily */ -extern struct segment *t1_PathXform ( struct segment *p0, struct XYspace *S ); -/* calculate the ending point of a path */ -extern void t1_PathDelta ( struct segment *p, struct fractpoint *pt ); -/* */ -extern struct segment *t1_BoundingBox ( pel h, pel w ); -/* produce a MOVE or LINE segment */ -extern struct segment *t1_PathSegment ( int type, fractpel x, fractpel y ); -/* join a MOVE or LINE segment to a path */ -extern struct segment *t1_JoinSegment ( struct segment *before, int type, fractpel x, fractpel y, struct segment *after ); -#if 0 -double t1_Hypoteneuse(); /* returns the length of a line */ -#endif -/* returns a rectangular path */ -extern struct segment *t1_BoxPath ( struct XYspace *S, int h, int w ); - -/*END SHARED*/ -/*SHARED*/ - -#define ConsumePath(p) MAKECONSUME(p,KillPath(p)) -#define UniquePath(p) MAKEUNIQUE(p,CopyPath(p)) - -/*END SHARED*/ -/*SHARED*/ - -struct segment { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - unsigned char size; /* size of the structure */ - unsigned char context; /* index to device context */ - struct segment *link; /* pointer to next structure in linked list */ - struct segment *last; /* pointer to last structure in list */ - struct fractpoint dest; /* relative ending location of path segment */ -} ; - -#define ISCLOSED(flag) ((flag)&0x80) /* subpath is closed */ -#define LASTCLOSED(flag) ((flag)&0x40) /* last segment in closed subpath */ - -/* -NOTE: The ISCLOSED flag is set on the MOVETYPE segment before the -subpath proper; the LASTCLOSED flag is set on the last segment (LINETYPE) -in the subpath - -We define the ISPATHANCHOR predicate to test that a path handle -passed by the user is valid: -*/ - -#define ISPATHANCHOR(p) (ISPATHTYPE(p->type)&&p->last!=NULL) - -/* -For performance reasons, a user's "location" object is identical to -a path whose only segment is a move segment. We define a predicate -to test for this case. See also :hdref refid=location.. -*/ - -#define ISLOCATION(p) ((p)->type == MOVETYPE && (p)->link == NULL) - -/*END SHARED*/ -/*SHARED*/ - -struct conicsegment { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - /* type = CONICTYPE */ - unsigned char size; /* as with any 'segment' type */ - unsigned char context; /* as with any 'segment' type */ - struct segment *link; /* as with any 'segment' type */ - struct segment *last; /* as with any 'segment' type */ - struct fractpoint dest; /* Ending point (C point) */ - struct fractpoint M; /* "midpoint" of conic explained above */ - float roundness; /* explained above */ -} ; -/*END SHARED*/ -/*SHARED*/ - -struct beziersegment { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - /* type = BEZIERTYPE */ - unsigned char size; /* as with any 'segment' type */ - unsigned char context; /* as with any 'segment' type */ - struct segment *link; /* as with any 'segment' type */ - struct segment *last; /* as with any 'segment' type */ - struct fractpoint dest; /* ending point (D) */ - struct fractpoint B; /* control point B */ - struct fractpoint C; /* control point C */ -} ; - -/*END SHARED*/ -/*SHARED*/ - -struct hintsegment { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - /* type = HINTTYPE */ - unsigned char size; /* size of the structure */ - unsigned char context; /* device context */ - struct segment *link; /* pointer to next structure in linked list */ - struct segment *last; /* pointer to last structure in list */ - struct fractpoint dest; /* ALWAYS 0,0 */ - struct fractpoint ref; - struct fractpoint width; - char orientation; - char hinttype; - char adjusttype; - char direction; - int label; -} ; - -/*END SHARED*/ -/*SHARED*/ - -/* -CONCAT links the 'p2' path chain on the end of the 'p1' chain. (This macro -is also used by the STROKES module.) -*/ -#define CONCAT(p1, p2) { \ - p1->last->link = p2; /* link p2 on end of p1 */ \ - p1->last = p2->last; /* last of new is last of p2 */ \ - p2->last = NULL; } /* only first segment has non-NULL "last" */ - -/*END SHARED*/ -/* dump a path list */ -extern void t1_DumpPath ( struct segment *p ); diff --git a/nx-X11/lib/font/Type1/pictures.h b/nx-X11/lib/font/Type1/pictures.h deleted file mode 100644 index 0abc715ce..000000000 --- a/nx-X11/lib/font/Type1/pictures.h +++ /dev/null @@ -1,50 +0,0 @@ -/* $Xorg: pictures.h,v 1.3 2000/08/17 19:46:31 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/pictures.h,v 1.3 1999/08/22 08:58:53 dawes Exp $ */ - -/* STUB */ - -#define CopyPicture(p) p -#define UniquePicture(p) p -#define KillPicture(p) -#define BegHandle(o,m) o -#define EndHandle(o,m) o -#define PictureBounds(P) P - -struct picture { - struct fractpoint origin; - struct fractpoint ending; -}; - -#define Phantom(o) t1_Phantom(o) -#define Snap(o) t1_Snap(o) - -extern struct segment *t1_Phantom ( struct segment *p ); -extern struct segment *t1_Snap ( struct segment *p ); diff --git a/nx-X11/lib/font/Type1/range.h b/nx-X11/lib/font/Type1/range.h deleted file mode 100644 index 496f000da..000000000 --- a/nx-X11/lib/font/Type1/range.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#if XFONT_CID -#define CID_NAME_MAX 255 /* max # of characters in a file name */ -#define CID_PATH_MAX 1024 /* max # of characters in a path name */ - -typedef struct spacerange_code { - unsigned int srcCodeLo; - unsigned int srcCodeHi; -} spacerangecode; - -typedef struct space_range { - struct space_range *next; - int rangecnt; - struct spacerange_code *spacecode; -} spacerange; - -typedef struct cidrange_code { - unsigned int srcCodeLo; - unsigned int srcCodeHi; - unsigned int dstCIDLo; -} cidrangecode; - -typedef struct cid_range { - struct cid_range *next; - int rangecnt; - struct cidrange_code *range; -} cidrange; -#endif diff --git a/nx-X11/lib/font/Type1/regions.c b/nx-X11/lib/font/Type1/regions.c deleted file mode 100644 index f8875dafb..000000000 --- a/nx-X11/lib/font/Type1/regions.c +++ /dev/null @@ -1,1651 +0,0 @@ -/* $Xorg: regions.c,v 1.3 2000/08/17 19:46:31 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/regions.c,v 3.8tsi Exp $ */ - /* REGIONS CWEB V0023 LOTS */ -/* -:h1 id=regions.REGIONS Module - Regions Operator Handler - -This module is responsible for creating and manipulating regions. - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - - -:h3.Include Files - -The included files are: -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -# include "os.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "curves.h" -#include "lines.h" -#include "pictures.h" -#include "fonts.h" -#include "hints.h" -#include "strokes.h" /* to pick up 'DoStroke' */ - - -static void newfilledge ( struct region *R, fractpel xmin, fractpel xmax, - fractpel ymin, fractpel ymax, int isdown ); -static struct edgelist *splitedge ( struct edgelist *list, pel y ); -static void vertjoin ( struct edgelist *top, struct edgelist *bottom ); -static int touches ( int h, pel *left, pel *right ); -static int crosses ( int h, pel *left, pel *right ); -static void edgemin ( int h, pel *e1, pel *e2 ); -static void edgemax ( int h, pel *e1, pel *e2 ); -static struct edgelist *NewEdge ( pel xmin, pel xmax, pel ymin, pel ymax, - pel *xvalues, int isdown ); -static struct edgelist *swathxsort ( struct edgelist *before0, - struct edgelist *edge ); -/* -:h3.Functions Provided to the TYPE1IMAGER User - -This module provides the following TYPE1IMAGER entry points: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Functions Provided to Other Modules - -This module provides the following entry points to other modules: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Macros Provided to Other Modules - -:h4.GOING_TO() - Macro Predicate Needed for Changing Direction, Etc. - -The actual generation of run end lists (edge boundaries) is left -to the low level rasterizing modules, LINES and CURVES. There -are some global region-type -questions that occur when doing a low-level -rasterization: -:ol. -:li.Did we just change direction in Y and therefore need to start -a new edge? -:li.Did we run out of allocated edge space? -:li.Do the minimum or maximum X values for the current edge need -updating? -:eol. -In general the REGIONS is not smart enough to answer those questions -itself. (For example, determining if and when a curve changes direction -may need detailed curve knowledge.) Yet, this must be done efficiently. -We provide a macro "GOING_TO" where the invoker tells us where it is -heading for (x2,y2), plus where it is now (x1,y1), plus the current -region under construction, and the macro answers the questions above. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h2.Data Structures Used to Represent Regions - -:h3.The "region" Structure - -The region structure is an anchor for a linked list of "edgelist" -structures (see :hdref refid=edgelist..). It also summarizes the -information in the edgelist structures (for example, the bounding -box of the region). And, it contains scratch areas used during -the creation of a region. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -The ISOPTIMIZED flag tells us if we've put a permanent region in -'optimal' form. -*/ -#define ISOPTIMIZED(flag) ((flag)&0x10) - -/* -The ISRECTANGULAR flag tells us if a region is a rectangle. We don't -always notice rectangles--if this flag is set, the region definitely -is a rectangle, but some rectangular regions will not have the flag -set. The flag is used to optimize some paths. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h4."TT_INFINITY" - A Constant Region Structure of Infinite Extent - -Infinity is the complement of a null area: -Note - removed the refcount = 1 init, replaced with references = 2 3-26-91 PNM -*/ -static struct region _infinity = { REGIONTYPE, - ISCOMPLEMENT(ON)+ISINFINITE(ON)+ISPERMANENT(ON)+ISIMMORTAL(ON), 2, - {0, 0}, {0, 0}, - 0, 0, 0, 0, - NULL, NULL, - 0, 0, 0, 0, 0, NULL, NULL, - NULL, 0, NULL, NULL }; -struct region *TT_INFINITY = &_infinity; - -/* -:h4."EmptyRegion" - A Region Structure with Zero Area - -This structure is used to initialize the region to be built in -Interior(): -Note - replaced refcount = 1 init with references = 2 3-26-91 PNM -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -struct region EmptyRegion = { REGIONTYPE, - ISPERMANENT(ON)+ISIMMORTAL(ON), 2, - {0, 0}, {0, 0}, - MAXPEL, MAXPEL, MINPEL, MINPEL, - NULL, NULL, - 0, 0, 0, 0, 0, NULL, NULL, - NULL, 0, NULL, NULL }; - -/* -:h3 id=edgelist.The "edgelist" Structure - -Regions are represented by a linked list of 'edgelist' structures. -When a region is complete, the structures are paired, one for the -left and one for the right edge. While a region is being built, -this rule may be violated temporarily. - -An 'edgelist' structure contains the X values for a given span -of Y values. The (X,Y) pairs define an edge. We use the crack -and edge coordinate system, so that integer values of X and Y -go between pels. The edge is defined between the minimum Y and -maximum Y. - -The linked list is kept sorted from top to bottom, that is, in -increasing y. Also, if 'e1' is an edgelist structure and 'e2' is the -next one in the list, they must have exactly the same ymin,ymax values -or be totally disjoint. These two requirements mean that if e2's ymin -is less than e1's ymax, it must be exactly equal to e1's ymin. A -sublist of structures with identical ymin and ymax values is called a -'swath'. - -In addition, edgelist structures are separately linked together based -on what subpath originally created them; each subpath is kept as a -separate circular linked list. This information is ignored unless -continuity checking is invoked. See :hdref refid=subpath. for a -complete description of this. -*/ - - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -The "edgelist" structure follows the convention of TYPE1IMAGER user -objects, having a type field and a flag field as the first two -elements. However, the user never sees "edgelist" structures -directly; he is given handles to "region" structures only. - -By having a type field, we can use the "copy" feature of Allocate() -to duplicate edge lists quickly. - -We also define two flag bits for this structure. The ISDOWN bit is set -if the edge is going in the direction of increasing Y. The ISAMBIGUOUS -bit is set if the edge is identical to its neighbor (edge->link); such -edges may be "left" when they should be "right", or vice versa, -unnecessarily confusing the continuity checking logic. The FixSubPaths() -routine in HINTS will swap ambiguous edges if that avoids crossing edges; -see :hdref refid=fixsubp.. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.KillRegion() - Destroys a Region - -KillRegion nominally just decrements the reference count to that region. -If the reference count becomes 0, all memory associated with it is -freed. We just follow the linked list, freeing as we go, then kill any -associated (thresholded) picture. -Note - added conditional return based on references 3-26-91 PNM -*/ - -void -KillRegion(struct region *area) /* area to free */ -{ - register struct edgelist *p; /* loop variable */ - register struct edgelist *next; /* loop variable */ - - if (area->references < 0) - Abort("KillRegion: negative reference count"); - if ( (--(area->references) > 1) || - ( (area->references == 1) && !ISPERMANENT(area->flag) ) ) - return; - - for (p=area->anchor; p != NULL; p=next) { - next = p->link; - Free(p); - } - if (area->thresholded != NULL) - KillPicture(area->thresholded); - Free(area); -} -/* -:h3.CopyRegion() - Makes a Copy of a Region -*/ -struct region * -CopyRegion(struct region *area) /* region to duplicate */ -{ - register struct region *r; /* output region built here */ - register struct edgelist *last = NULL; /* loop variable */ - register struct edgelist *p,*newp; /* loop variables */ - - r = (struct region *)Allocate(sizeof(struct region), area, 0); - r->anchor = NULL; - - for (p=area->anchor; VALIDEDGE(p); p=p->link) { - - newp = NewEdge(p->xmin, p->xmax, p->ymin, p->ymax, p->xvalues, ISDOWN(p->flag)); - if (r->anchor == NULL) - r->anchor = last = newp; - else - last->link = newp; - - last = newp; - } - if (area->thresholded != NULL) - /* replaced DupPicture with Dup() 3-26-91 PNM */ - r->thresholded = (struct picture *)Dup(area->thresholded); - return(r); -} -/* -:h4.NewEdge() - Allocates and Returns a New "edgelist" Structure - -We allocate space for the X values contiguously with the 'edgelist' -structure that locates them. That way, we only have to free the -edgelist structure to free all memory associated with it. Damn -clever, huh? -*/ - -static struct edgelist * -NewEdge(pel xmin, pel xmax, /* X extent of edge */ - pel ymin, pel ymax, /* Y extent of edge */ - pel *xvalues, /* list of X values for entire edge */ - int isdown) /* flag: TRUE means edge progresses downward */ -{ - static struct edgelist template = { - EDGETYPE, 0, 1, NULL, NULL, - 0, 0, 0, 0, NULL }; - - register struct edgelist *r; /* returned structure */ - register int iy; /* ymin adjusted for 'long' alignment purposes */ - - if (ymin >= ymax) - Abort("newedge: height not positive"); -/* -We are going to copy the xvalues into a newly allocated area. It -helps performance if the values are all "long" aligned. We can test -if the xvalues are long aligned by ANDing the address with the -(sizeof(long) - 1)--if non zero, the xvalues are not aligned well. We -set 'iy' to the ymin value that would give us good alignment: -*/ - iy = ymin - (((unsigned long)xvalues) & (sizeof(long)-1)) / sizeof(pel); - - r = (struct edgelist *)Allocate(sizeof(struct edgelist), &template, - (ymax - iy) * sizeof(pel)); - - if (isdown) r->flag = ISDOWN(ON); - r->xmin = xmin; - r->xmax = xmax; - r->ymin = ymin; - r->ymax = ymax; - - r->xvalues = (pel *) FOLLOWING(r); - if (ymin != iy) { - r->xvalues += ymin - iy; - xvalues -= ymin - iy; - } - -/* -We must round up (ymax - iy) so we get the ceiling of the number of -longs. The destination must be able to hold these extra bytes because -Allocate() makes everything it allocates be in multiples of longs. -*/ - LONGCOPY(&r[1], xvalues, (ymax - iy) * sizeof(pel) + sizeof(long) - 1); - - return(r); -} - -/* -:h3 id=discard.discard() - Discard All Edges Between Two Edges - -At first glance it would seem that we could discard an edgelist -structure merely by unlinking it from the list and freeing it. You are -wrong, region-breath! For performance, the X values associated with an -edge are allocated contiguously with it. So, we free the X values when -we free a structure. However, once an edge has been split, we are no -longer sure which control block actually is part of the memory block -that contains the edges. Rather than trying to decide, we play it safe -and never free part of a region. - -So, to mark a 'edgelist' structure as discarded, we move it to the end -of the list and set ymin=ymax. -*/ - -static void -discard(struct edgelist *left, /* all edges between here exclusive */ - struct edgelist *right) /* should be discarded */ -{ - register struct edgelist *beg,*end,*p; - - beg = left->link; - if (beg == right) - return; - - for (p = beg; p != right; p = p->link) { - if (p->link == NULL && right != NULL) - Abort("discard(): ran off end"); - p->ymin = p->ymax = 32767; - end = p; - } - /* - * now put the chain beg/end at the end of right, if it is not - * already there: - */ - if (right != NULL) { - left->link = right; - while (right->link != NULL) - right = right->link; - right->link = beg; - } - end->link = NULL; -} - -/* -:h4.Unwind() - Discards Edges That Fail the Winding Rule Test - -The winding rule says that upward going edges should be paired with -downward going edges only, and vice versa. So, if two upward edges -or two downward edges are nominally left/right pairs, Unwind() should -discard the second one. Everything should balance; we should discard -an even number of edges; of course, we abort if we don't. -*/ -static void -Unwind(struct edgelist *area) /* input area modified in place */ -{ - register struct edgelist *last = NULL,*next; /* struct before and after current one */ - register int y; /* ymin of current swath */ - register int count,newcount; /* winding count registers */ - - while (VALIDEDGE(area)) { - - count = 0; - y = area->ymin; - - do { - next = area->link; - - if (ISDOWN(area->flag)) - newcount = count + 1; - else - newcount = count - 1; - - if (count == 0 || newcount == 0) - last = area; - else - discard(last, next); - - count = newcount; - area = next; - - } while (area != NULL && area->ymin == y); - - if (count != 0) - Abort("Unwind: uneven edges"); - } -} -/* -:h2.Building Regions - -:h3.Interior() - Iterate Through a Path, Building a Region - -This routine is the workhorse driver routine that iterates through a -path, calling the appropriate stepping routines to actually produce the -run end "edgelist" structures. - -:ol. -:li."Interior" calls StepLine or StepConic or StepBezier as appropriate -to produce run ends. -:li.Occasionally these routines will notice a change in Y direction -and will call ChangeDirection (through the GOING_TO macro); this is -a call back to the REGIONS module. -:li.ChangeDirection will call whatever function is in the region -structure; for Interior, this function is 'newfilledge'. -:li.Newfilledge will call NewEdge to create a new edgelist structure, -then, call SortSwath to sort it onto the linked list being built at -the region "anchor". -:eol. - -By making the function called by ChangeDirection be a parameter of the -region, we allow the same ChangeDirection logic to be used by stroking. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -struct region * -Interior(struct segment *p, /* take interior of this path */ - int fillrule) /* rule to follow if path crosses itself */ -{ - register fractpel x,y; /* keeps ending point of path segment */ - fractpel lastx,lasty; /* previous x,y from path segment before */ - register struct region *R; /* region I will build */ - register struct segment *nextP; /* next segment of path */ - struct fractpoint hint; /* accumulated hint value */ - char tempflag; /* flag; is path temporary? */ - char Cflag; /* flag; should we apply continuity? */ - - if (p == NULL) - return(NULL); -/* -Establish the 'Cflag' continuity flag based on user's fill rule and -our own 'Continuity' pragmatic (0: never do continuity, 1: do what -user asked, >1: do it regardless). -*/ - if (fillrule > 0) { - Cflag = Continuity > 0; - fillrule -= CONTINUITY; - } - else - Cflag = Continuity > 1; - - ARGCHECK((fillrule != WINDINGRULE && fillrule != EVENODDRULE), - "Interior: bad fill rule", NULL, NULL, (1,p), struct region *); - - if (p->type == TEXTTYPE) -/* if (fillrule != EVENODDRULE) - else */ - return((struct region *)UniquePath(p)); - if (p->type == STROKEPATHTYPE) { - if (fillrule == WINDINGRULE) - return((struct region *)DoStroke(p)); - else - p = CoercePath(p); - } - - R = (struct region *)Allocate(sizeof(struct region), &EmptyRegion, 0); - - ARGCHECK(!ISPATHANCHOR(p), "Interior: bad path", p, R, (0), struct region *); - ARGCHECK((p->type != MOVETYPE), "Interior: path not closed", p, R, (0), struct region *); - - -/* changed definition from !ISPERMANENT to references <= 1 3-26-91 PNM */ - tempflag = (p->references <= 1); /* only first segment in path is so marked */ - if (!ISPERMANENT(p->flag)) p->references -= 1; - - R->newedgefcn = newfilledge; -/* -Believe it or not, "R" is now completely initialized. We are counting -on the copy of template to get other fields the way we want them, -namely -:ol. -:li.anchor = NULL -:li.xmin, ymin, xmax, ymax, to minimum and maximum values respectively. -:eol. -Anchor = NULL is very -important to ChangeDirection. -See :hdref refid=CD.. - -To minimize problems of "wrapping" in our pel arithmetic, we keep an -origin of the region which is the first move. Hopefully, that keeps -numbers within plus or minus 32K pels. -*/ - R->origin.x = 0/*TOFRACTPEL(NEARESTPEL(p->dest.x))*/; - R->origin.y = 0/*TOFRACTPEL(NEARESTPEL(p->dest.y))*/; - lastx = - R->origin.x; - lasty = - R->origin.y; -/* -ChangeDirection initializes other important fields in R, such as -lastdy, edge, edgeYstop, edgexmin, and edgexmax. The first segment -is a MOVETYPE, so it will be called first. -*/ -/* -The hints data structure must be initialized once for each path. -*/ - - if (ProcessHints) - InitHints(); /* initialize hint data structure */ - - while (p != NULL) { - - x = lastx + p->dest.x; - y = lasty + p->dest.y; - - nextP = p->link; - -/* -Here we start the hints processing by initializing the hint value to -zero. If ProcessHints is FALSE, the value will remain zero. -Otherwise, hint accumulates the computed hint values. -*/ - - hint.x = hint.y = 0; - -/* -If we are processing hints, and this is a MOVE segment (other than -the first on the path), we need to close (reverse) any open hints. -*/ - - if (ProcessHints) - if ((p->type == MOVETYPE) && (p->last == NULL)) { - CloseHints(&hint); - } - -/* -Next we run through all the hint segments (if any) attached to this -segment. If ProcessHints is TRUE, we will accumulate computed hint -values. In either case, nextP will be advanced to the first non-HINT -segment (or NULL), and each hint segment will be freed if necessary. -*/ - - while ((nextP != NULL) && (nextP->type == HINTTYPE)) { - if (ProcessHints) - ProcessHint((struct hintsegment *)nextP, - x + hint.x, y + hint.y, &hint); - - { - register struct segment *saveP = nextP; - - nextP = nextP->link; - if (tempflag) - Free(saveP); - } - } - -/* -We now apply the full hint value to the ending point of the path segment. -*/ - - x += hint.x; - y += hint.y; - - switch(p->type) { - - case LINETYPE: - StepLine(R, lastx, lasty, x, y); - break; - - case CONICTYPE: - { - -/* -For a conic curve, we apply half the hint value to the conic midpoint. -*/ - - } - break; - - case BEZIERTYPE: - { - register struct beziersegment *bp = (struct beziersegment *) p; - -/* -For a Bezier curve, we apply the full hint value to the Bezier C point. -*/ - - StepBezier(R, lastx, lasty, - lastx + bp->B.x, lasty + bp->B.y, - lastx + bp->C.x + hint.x, - lasty + bp->C.y + hint.y, - x, y); - } - break; - - case MOVETYPE: -/* -At this point we have encountered a MOVE segment. This breaks the -path, making it disjoint. -*/ - if (p->last == NULL) /* i.e., not first in path */ - ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0); - - ChangeDirection(CD_FIRST, R, x, y, (fractpel) 0); -/* -We'll just double check for closure here. We forgive an appended -MOVETYPE at the end of the path, if it isn't closed: -*/ - if (!ISCLOSED(p->flag) && p->link != NULL) - return((struct region *)ArgErr("Fill: sub-path not closed", p, NULL)); - break; - - default: - Abort("Interior: path type error"); - } -/* -We're done with this segment. Advance to the next path segment in -the list, freeing this one if necessary: -*/ - lastx = x; lasty = y; - - if (tempflag) - Free(p); - p = nextP; - } - ChangeDirection(CD_LAST, R, lastx, lasty, (fractpel) 0); - R->ending.x = lastx; - R->ending.y = lasty; -/* -Finally, clean up the region's based on the user's 'fillrule' request: -*/ - if (Cflag) - ApplyContinuity(R); - if (fillrule == WINDINGRULE) - Unwind(R->anchor); - return(R); -} -/* -:h3."workedge" Array - -This is a statically allocated array where edges are built -before being copied into more permanent storage by NewEdge(). -*/ - -#ifndef MAXEDGE -#define MAXEDGE 1000 -#endif - -static pel workedge[MAXEDGE]; -static pel *currentworkarea = workedge; -static pel currentsize = MAXEDGE; - -/* -:h3 id=cd.ChangeDirection() - Called When Y Direction Changes - -The rasterizing routines call this entry point when they detect -a change in Y. We then build the current edge and sort it into -emerging edgelist at 'anchor' by calling whatever "newedgefcn" -is appropriate. -*/ - -void -ChangeDirection(int type, /* CD_FIRST, CD_CONTINUE, or CD_LAST */ - struct region *R, /* region in which we are changing direction */ - fractpel x, fractpel y, /* current beginning x,y */ - fractpel dy) /* direction and magnitude of change in y */ -{ - register fractpel ymin,ymax; /* minimum and maximum Y since last call */ - register pel iy; /* nearest integer pel to 'y' */ - register pel idy; /* nearest integer pel to 'dy' */ - register int ydiff; /* allowed Y difference in 'currentworkarea' */ - - if (type != CD_FIRST) { - - if (R->lastdy > 0) { - ymin = R->firsty; - ymax = y; - } - else { - ymin = y; - ymax = R->firsty; - } - - if (ymax < ymin) - Abort("negative sized edge?"); - - - (*R->newedgefcn)(R, R->edgexmin, R->edgexmax, ymin, ymax, - R->lastdy > 0); - - } - - R->firsty = y; - R->firstx = x; - R->lastdy = dy; - - iy = NEARESTPEL(y); - idy = NEARESTPEL(dy); - if (currentworkarea != workedge && idy < MAXEDGE && idy > -MAXEDGE) { - NonObjectFree(currentworkarea); - currentworkarea = workedge; - currentsize = MAXEDGE; - } - ydiff = currentsize - 1; - if (dy > 0) { - R->edge = ¤tworkarea[-iy]; - R->edgeYstop = TOFRACTPEL(ydiff + iy) + FPHALF; - } - else { - R->edge = ¤tworkarea[ydiff - iy]; - R->edgeYstop = TOFRACTPEL(iy - ydiff) - FPHALF; - } - R->edgexmax = R->edgexmin = x; -/* -If this is the end of a subpath, we complete the subpath circular -chain: -*/ - if (type == CD_LAST && R->lastedge != NULL) { - register struct edgelist *e = R->firstedge; - - while (e->subpath != NULL) - e = e->subpath; - e->subpath = R->lastedge; - R->lastedge = R->firstedge = NULL; - } -} -/* -:h3 id=newfill.newfilledge() - Called When We Have a New Edge While Filling - -This is the prototypical "newedge" function passed to "Rasterize" and -stored in "newedgefcn" in the region being built. - -If the edge is non-null, we sort it onto the list of edges we are -building at "anchor". - -This function also has to keep the bounding box of the region -up to date. -*/ - -static void -newfilledge(struct region *R, /* region being built */ - fractpel xmin, fractpel xmax, /* X range of this edge */ - fractpel ymin, fractpel ymax, /* Y range of this edge */ - int isdown) /* flag: TRUE means edge goes down, else up */ -{ - - register pel pelxmin,pelymin,pelxmax,pelymax; /* pel versions of bounds */ - register struct edgelist *edge; /* newly created edge */ - - pelymin = NEARESTPEL(ymin); - pelymax = NEARESTPEL(ymax); - if (pelymin == pelymax) - return; - - pelxmin = NEARESTPEL(xmin); - pelxmax = NEARESTPEL(xmax); - - if (pelxmin < R->xmin) R->xmin = pelxmin; - if (pelxmax > R->xmax) R->xmax = pelxmax; - if (pelymin < R->ymin) R->ymin = pelymin; - if (pelymax > R->ymax) R->ymax = pelymax; - - edge = NewEdge(pelxmin, pelxmax, pelymin, pelymax, &R->edge[pelymin], isdown); - edge->subpath = R->lastedge; - R->lastedge = edge; - if (R->firstedge == NULL) - R->firstedge = edge; - - R->anchor = SortSwath(R->anchor, edge, swathxsort); - -} - -/* -:h2.Sorting Edges - -:h3.SortSwath() - Vertically Sort an Edge into a Region - -This routine sorts an edge or a pair of edges into a growing region, -so that the region maintains its top-to-bottom, left-to-right form. -The rules for sorting horizontally may vary depending on what you -are doing, but the rules for vertical sorting are always the same. -This routine is passed an argument that is a function that will -perform the horizontal sort on demand (for example, swathxsort() or -SwathUnion()). - -This is a recursive routine. A new edge (or edge pair) may overlap -the list I am building in strange and wonderful ways. Edges may -cross. When this happens, my strategy is to split the incoming edge -(or the growing list) in two at that point, execute the actual sort on -the top part of the split, and recursively call myself to figure out -exactly where the bottom part belongs. -*/ - -#define TOP(e) ((e)->ymin) /* the top of an edge (for readability */ -#define BOTTOM(e) ((e)->ymax) /* the bottom of an edge (for readability */ - -struct edgelist * -SortSwath(struct edgelist *anchor, /* list being built */ - struct edgelist *edge, /* incoming edge or pair of edges */ - SwathFunc swathfcn) /* horizontal sorter */ -{ - register struct edgelist *before,*after; - struct edgelist base; - - if (anchor == NULL) - return(edge); - - before = &base; - before->ymin = before->ymax = MINPEL; - before->link = after = anchor; - -/* -If the incoming edge is above the current list, we connect the current -list to the bottom of the incoming edge. One slight complication is -if the incoming edge overlaps into the current list. Then, we -first split the incoming edge in two at the point of overlap and recursively -call ourselves to sort the bottom of the split into the current list: -*/ - if (TOP(edge) < TOP(after)) { - if (BOTTOM(edge) > TOP(after)) { - - after = SortSwath(after, splitedge(edge, TOP(after)), swathfcn); - } - vertjoin(edge, after); - return(edge); - } -/* -At this point the top of edge is not higher than the top of the list, -which we keep in 'after'. We move the 'after' point down the list, -until the top of the edge occurs in the swath beginning with 'after'. - -If the bottom of 'after' is below the bottom of the edge, we have to -split the 'after' swath into two parts, at the bottom of the edge. -If the bottom of 'after' is above the bottom of the swath, -*/ - - while (VALIDEDGE(after)) { - - if (TOP(after) == TOP(edge)) { - if (BOTTOM(after) > BOTTOM(edge)) - vertjoin(after, splitedge(after, BOTTOM(edge))); - else if (BOTTOM(after) < BOTTOM(edge)) { - after = SortSwath(after, - splitedge(edge, BOTTOM(after)), swathfcn); - } - break; - } - else if (TOP(after) > TOP(edge)) { - if (BOTTOM(edge) > TOP(after)) { - after = SortSwath(after, - splitedge(edge, TOP(after)), swathfcn); - } - break; - } - else if (BOTTOM(after) > TOP(edge)) - vertjoin(after, splitedge(after, TOP(edge))); - - before = after; - after = after->link; - } - -/* -At this point 'edge' exactly corresponds in height to the current -swath pointed to by 'after'. -*/ - if (after != NULL && TOP(after) == TOP(edge)) { - before = (*swathfcn)(before, edge); - after = before->link; - } -/* -At this point 'after' contains all the edges after 'edge', and 'before' -contains all the edges before. Whew! A simple matter now of adding -'edge' to the linked list in its rightful place: -*/ - before->link = edge; - if (RegionDebug > 1) { - while (edge->link != NULL) { - edge = edge->link; - } - } - else - for (; edge->link != NULL; edge = edge->link) { ; } - - edge->link = after; - return(base.link); -} - -/* -:h3.splitedge() - Split an Edge or Swath in Two at a Given Y Value - -This function returns the edge or swath beginning at the Y value, and -is guaranteed not to change the address of the old swath while splitting -it. -*/ - -static struct edgelist * -splitedge(struct edgelist *list, /* area to split */ - pel y) /* Y value to split list at */ -{ - register struct edgelist *new; /* anchor for newly built list */ - register struct edgelist *last = NULL; /* end of newly built list */ - register struct edgelist *r; /* temp pointer to new structure */ - register struct edgelist *lastlist; /* temp pointer to last 'list' value */ - - lastlist = new = NULL; - - while (list != NULL) { - if (y < list->ymin) - break; - if (y >= list->ymax) - Abort("splitedge: above top of list"); - if (y == list->ymin) - Abort("splitedge: would be null"); - - r = (struct edgelist *)Allocate(sizeof(struct edgelist), list, 0); -/* -At this point 'r' points to a copy of the single structure at 'list'. -We will make 'r' be the new split 'edgelist'--the lower half. -We don't bother to correct 'xmin' and 'xmax', we'll take the -the pessimistic answer that results from using the old values. -*/ - r->ymin = y; - r->xvalues = list->xvalues + (y - list->ymin); -/* -Note that we do not need to allocate new memory for the X values, -they can remain with the old "edgelist" structure. We do have to -update that old structure so it is not as high: -*/ - list->ymax = y; -/* -Insert 'r' in the subpath chain: -*/ - r->subpath = list->subpath; - list->subpath = r; -/* -Now attach 'r' to the list we are building at 'new', and advance -'list' to point to the next element in the old list: -*/ - if (new == NULL) - new = r; - else - last->link = r; - last = r; - lastlist = list; - list = list->link; - } -/* -At this point we have a new list built at 'new'. We break the old -list at 'lastlist', and add the broken off part to the end of 'new'. -Then, we return the caller a pointer to 'new': -*/ - if (new == NULL) - Abort("null splitedge"); - lastlist->link = NULL; - last->link = list; - return(new); -} - -/* -:h3.vertjoin() - Join Two Disjoint Edge Lists Vertically - -The two edges must be disjoint vertically. -*/ -static void vertjoin(top, bottom) - register struct edgelist *top; /* uppermost region */ - register struct edgelist *bottom; /* bottommost region */ -{ - if (BOTTOM(top) > TOP(bottom)) - Abort("vertjoin not disjoint"); - - for (; top->link != NULL; top=top->link) { ; } - - top->link = bottom; - return; -} - -/* -:h3.swathxsort() - Sorting by X Values - -We need to sort 'edge' into its rightful -place in the swath by X value, taking care that we do not accidentally -advance to the next swath while searching for the correct X value. Like -all swath functions, this function returns a pointer to the edge -BEFORE the given edge in the sort. -*/ - -static struct edgelist * -swathxsort(struct edgelist *before0, /* edge before this swath */ - struct edgelist *edge) /* input edge */ -{ - register struct edgelist *before; - register struct edgelist *after; - register pel y = 0; - - before = before0; - after = before->link; - - while (after != NULL && TOP(after) == TOP(edge)) { - - register pel *x1,*x2; - - y = TOP(edge); - x1 = after->xvalues; - x2 = edge->xvalues; - - while (y < BOTTOM(edge) && *x1 == *x2) { - x1++; x2++; y++; - } - if (y >= BOTTOM(edge)) { - edge->flag |= ISAMBIGUOUS(ON); - after->flag |= ISAMBIGUOUS(ON); - break; - } - - if (*x1 >= *x2) - break; - - before = after; - after = after->link; - } - -/* -At this point, 'edge' is between 'before' and 'after'. If 'edge' didn't -cross either of those other edges, we would be done. We check for -crossing. If it does cross, we split the problem up by calling SortSwath -recursively with the part of the edge that is below the crossing point: -*/ -{ - register int h0,h; /* height of edge--number of scans */ - - h0 = h = BOTTOM(edge) - y; - y -= TOP(edge); - - if (h0 <= 0) { - return(before); - } - - if (TOP(before) == TOP(edge)) - h -= crosses(h, &before->xvalues[y], &edge->xvalues[y]); - if (after != NULL && TOP(after) == TOP(edge)) - h -= crosses(h, &edge->xvalues[y], &after->xvalues[y]); - - if (h < h0) { - SortSwath(before0->link, - splitedge(edge, TOP(edge) + y + h), - swathxsort); - - } -} - - return(before); -} -/* -:h3.SwathUnion() - Union Two Edges by X Value - -We have a left and right edge that must be unioned into a growing -swath. If they are totally disjoint, they are just added in. The -fun comes in they overlap the existing edges. Then some edges -will disappear. -*/ - -struct edgelist * -SwathUnion(struct edgelist *before0, /* edge before the swath */ - struct edgelist *edge) /* list of two edges to be unioned */ -{ - register int h; /* saves height of edge */ - register struct edgelist *rightedge; /* saves right edge of 'edge' */ - register struct edgelist *before,*after; /* edge before and after */ - int h0; /* saves initial height */ - - h0 = h = edge->ymax - edge->ymin; - if (h <= 0) - Abort("SwathUnion: 0 height swath?"); - - before = before0; - after = before->link; - - while (after != NULL && TOP(after) == TOP(edge)) { - register struct edgelist *right; - - right = after->link; - if (right->xvalues[0] >= edge->xvalues[0]) - break; - before = right; - after = before->link; - } -/* -This is the picture at this point. 'L' indicates a left hand edge, -'R' indicates the right hand edge. -'<--->' indicates the degree of uncertainty as to its placement -relative to other edges: -:xmp atomic. - before after - R <---L----> R L R L R - <---L---> <------R--------------------------> - edge -:exmp. -In case the left of 'edge' touches 'before', we need to reduce -the height by that amount. -*/ - if (TOP(before) == TOP(edge)) - h -= touches(h, before->xvalues, edge->xvalues); - - rightedge = edge->link; - - if (after == NULL || TOP(after) != TOP(edge) || - after->xvalues[0] > rightedge->xvalues[0]) { -/* -On this side of the the above 'if', the new edge is disjoint from the -existing edges in the swath. This is the picture: -:xmp atomic. - before after - R L R L R L R - L R - edge -:exmp. -We will verify it remains disjoint for the entire height. If the -situation changes somewhere down the edge, we split the edge at that -point and recursively call ourselves (through 'SortSwath') to figure -out the new situation: -*/ - if (after != NULL && TOP(after) == TOP(edge)) - h -= touches(h, rightedge->xvalues, after->xvalues); - if (h < h0) - SortSwath(before0->link, splitedge(edge, edge->ymin + h), t1_SwathUnion); - /* go to "return" this edge pair; it is totally disjoint */ - } - else { -/* -At this point, at the 'else', we know that the -new edge overlaps one or more pairs in the existing swath. Here is -a picture of our knowledge and uncertainties: -:xmp atomic. - before after - R L R L R L R - <---L---> <---R-------------------> - edge -:exmp. -We need to move 'after' along until it is to the right of the -right of 'edge'. ('After' should always point to a left edge of a pair:) -*/ - register struct edgelist *left; /* variable to keep left edge in */ - - do { - left = after; - after = (after->link)->link; - - } while (after != NULL && TOP(after) == TOP(edge) - && after->xvalues[0] <= rightedge->xvalues[0]); -/* -At this point this is the picture: -:xmp atomic. - before left after - R L R L R L R - <---L---> <---R---> - edge -:exmp. -We need to verify that the situation stays like this all the way -down the edge. Again, if the -situation changes somewhere down the edge, we split the edge at that -point and recursively call ourselves (through 'SortSwath') to figure -out the new situation: -*/ - - h -= crosses(h, left->xvalues, rightedge->xvalues); - h -= crosses(h, edge->xvalues, ((before->link)->link)->xvalues); - - if (after != NULL && TOP(after) == TOP(edge)) - - h -= touches(h, rightedge->xvalues, after->xvalues); - -/* -OK, if we touched either of our neighbors we need to split at that point -and recursively sort the split edge onto the list. One tricky part -is that when we recursively sort, 'after' will change if it was not -in our current swath: -*/ - if (h < h0) { - SortSwath(before0->link, - splitedge(edge, edge->ymin + h), - t1_SwathUnion); - - if (after == NULL || TOP(after) != TOP(edge)) - for (after = before0->link; - TOP(after) == TOP(edge); - after = after->link) { ; } - } -/* -Now we need to augment 'edge' by the left and right of the overlapped -swath, and to discard all edges between before and after, because they -were overlapped and have been combined with the new incoming 'edge': -*/ - edge->xmin = MIN(edge->xmin, (before->link)->xmin); - edge->xmax = MIN(edge->xmax, (before->link)->xmax); - edgemin(h, edge->xvalues, (before->link)->xvalues); - rightedge->xmin = MAX(rightedge->xmin, (left->link)->xmin); - rightedge->xmax = MAX(rightedge->xmax, (left->link)->xmax); - edgemax(h, rightedge->xvalues, (left->link)->xvalues); - discard(before, after); - } - return(before); -} -#ifdef notused -/* -:h3.swathrightmost() - Simply Sorts New Edge to Rightmost of Swath - -Like all swath functions, this function returns a pointer to the edge -BEFORE the given edge in the sort. -*/ - -static struct edgelist * -swathrightmost(struct edgelist *before, /* edge before this swath */ - struct edgelist *edge) /* input edge */ -{ - register struct edgelist *after; - - after = before->link; - - while (after != NULL && TOP(after) == TOP(edge)) { - before = after; - after = after->link; - } - - return(before); - -} -#endif -/* -:h3.touches() - Returns the Remaining Height When Two Edges Touch - -So, it will return 0 if they never touch. Allows incredibly(?) mnemonic -if (touches(...)) construct. -*/ - -static int -touches(int h, pel *left, pel *right) -{ - for (; h > 0; h--) - if (*left++ >= *right++) - break; - return(h); -} -/* -:h3.crosses() - Returns the Remaining Height When Two Edges Cross - -So, it will return 0 if they never cross. -*/ - -static int -crosses(int h, pel *left, pel *right) -{ - for (; h > 0; h--) - if (*left++ > *right++) - break; - return(h); -} -/* -:h3.cedgemin() - Stores the Mininum of an Edge and an X Value -*/ - -static void -cedgemin(int h, pel *e1, pel x) -{ - for (; --h >= 0; e1++) - if (*e1 > x) - *e1 = x; -} -/* -:h3.cedgemax() - Stores the Maximum of an Edge and an X Value -*/ - -static void -cedgemax(int h, pel *e1, pel x) -{ - for (; --h >= 0; e1++) - if (*e1 < x) - *e1 = x; -} -/* -:h3.edgemin() - Stores the Mininum of Two Edges in First Edge -*/ - -static void -edgemin(int h, pel *e1, pel *e2) -{ - for (; --h >= 0; e1++,e2++) - if (*e1 > *e2) - *e1 = *e2; -} -/* -:h3.edgemax() - Stores the Maximum of Two Edges in First Edge -*/ - -static void -edgemax(int h, pel *e1, pel *e2) -{ - for (; --h >= 0; e1++,e2++) - if (*e1 < *e2) - *e1 = *e2; -} - -/* -:h2.Changing the Representation of Regions - -For convenience and/or performance, we sometimes like to change the way -regions are represented. This does not change the object itself, just -the representation, so these transformations can be made on a permanent -region. - -*/ - -void -MoveEdges(struct region *R, /* region to modify */ - fractpel dx, fractpel dy) /* delta X and Y to move edge list by */ -{ - register struct edgelist *edge; /* for looping through edges */ - - R->origin.x += dx; - R->origin.y += dy; - R->ending.x += dx; - R->ending.y += dy; - if (R->thresholded != NULL) { - R->thresholded->origin.x -= dx; - R->thresholded->origin.y -= dy; - } -/* -From now on we will deal with dx and dy as integer pel values: -*/ - dx = NEARESTPEL(dx); - dy = NEARESTPEL(dy); - if (dx == 0 && dy == 0) - return; - - R->xmin += dx; - R->xmax += dx; - R->ymin += dy; - R->ymax += dy; - - for (edge = R->anchor; VALIDEDGE(edge); edge = edge->link) { - edge->ymin += dy; - edge->ymax += dy; - if (dx != 0) { - register int h; /* loop index; height of edge */ - register pel *Xp; /* loop pointer to X values */ - - edge->xmin += dx; - edge->xmax += dx; - for (Xp = edge->xvalues, h = edge->ymax - edge->ymin; - --h >= 0; ) - *Xp++ += dx; - } - } -} - -/* -:h3.UnJumble() - Sort a Region Top to Bottom - -It is an open question whether it pays in general to do this. -*/ - -void -UnJumble(struct region *region) /* region to sort */ -{ - register struct edgelist *anchor; /* new lists built here */ - register struct edgelist *edge; /* edge pointer for loop */ - register struct edgelist *next; /* ditto */ - - anchor = NULL; - - for (edge=region->anchor; VALIDEDGE(edge); edge=next) { - if (edge->link == NULL) - Abort("UnJumble: unpaired edge?"); - next = edge->link->link; - edge->link->link = NULL; - anchor = SortSwath(anchor, edge, t1_SwathUnion); - } - - if (edge != NULL) - vertjoin(anchor, edge); - - region->anchor = anchor; - region->flag &= ~ISJUMBLED(ON); -} - -/* -*/ -#ifdef notused -static void -OptimizeRegion(struct region *R) /* region to optimize */ -{ - register pel *xP; /* pel pointer for inner loop */ - register int x; /* holds X value */ - register int xmin,xmax; /* holds X range */ - register int h; /* loop counter */ - register struct edgelist *e; /* edgelist pointer for loop */ - - R->flag |= ISRECTANGULAR(ON); - - for (e = R->anchor; VALIDEDGE(e); e=e->link) { - xmin = MAXPEL; - xmax = MINPEL; - for (h = e->ymax - e->ymin, xP = e->xvalues; --h >= 0;) { - x = *xP++; - if (x < xmin) xmin = x; - if (x > xmax) xmax = x; - } - if (xmin != xmax || (xmin != R->xmin && xmax != R->xmax)) - R->flag &= ~ISRECTANGULAR(ON); - if (xmin < e->xmin || xmax > e->xmax) - Abort("Tighten: existing edge bound was bad"); - if (xmin < R->xmin || xmax > R->xmax) - Abort("Tighten: existing region bound was bad"); - e->xmin = xmin; - e->xmax = xmax; - } - R->flag |= ISOPTIMIZED(ON); -} -#endif - -/* -:h2.Miscelaneous Routines - -:h3.MoreWorkArea() - Allocate New Space for "edge" - -Our strategy is to temporarily allocate an array to hold this -unexpectedly large edge. ChangeDirection frees this array any time -it gets a shorter 'dy'. -*/ - -/*ARGSUSED*/ -void -MoreWorkArea(struct region *R, /* region we are generating */ - fractpel x1, fractpel y1, /* starting point of line */ - fractpel x2, fractpel y2) /* ending point of line */ -{ - register int idy; /* integer dy of line */ - - idy = NEARESTPEL(y1) - NEARESTPEL(y2); - if (idy < 0) idy = - idy; - - /* - * we must add one to the delta for the number of run ends we - * need to store: - */ - if (++idy > currentsize) { - if (currentworkarea != workedge) - NonObjectFree(currentworkarea); - currentworkarea = (pel *)Allocate(0, NULL, idy * sizeof(pel)); - currentsize = idy; - } - ChangeDirection(CD_CONTINUE, R, x1, y1, y2 - y1); -} - -/* -:h3.BoxClip() - Clip a Region to a Rectangle - -BoxClip also duplicates the region if it is permanent. Note the -clipping box is specified in REGION coordinates, that is, in -coordinates relative to the region (0,0) point -*/ - -struct region * -BoxClip(struct region *R, /* region to clip */ - pel xmin, pel ymin, /* upper left hand corner of rectangle */ - pel xmax, pel ymax) /* lower right hand corner */ -{ - struct edgelist anchor; /* pretend edgelist to facilitate discards */ - register struct edgelist *e,*laste; - - R = UniqueRegion(R); - - if (xmin > R->xmin) { - R->xmin = xmin; - } - if (xmax < R->xmax) { - R->xmax = xmax; - } - - if (ymin > R->ymin) { - R->ymin = ymin; - } - if (ymax < R->ymax) { - R->ymax = ymax; - } - - - laste = &anchor; - anchor.link = R->anchor; - - for (e = R->anchor; VALIDEDGE(e); e = e->link) { - if (TOP(e) < ymin) { - e->xvalues += ymin - e->ymin; - e->ymin = ymin; - } - if (BOTTOM(e) > ymax) - e->ymax = ymax; - if (TOP(e) >= BOTTOM(e)) { - discard(laste, e->link->link); - e = laste; - continue; - } - if (e->xmin < xmin) { - cedgemax(BOTTOM(e) - TOP(e), e->xvalues, xmin); - e->xmin = xmin; - e->xmax = MAX(e->xmax, xmin); - } - if (e->xmax > xmax) { - cedgemin(BOTTOM(e) - TOP(e), e->xvalues, xmax); - e->xmin = MIN(e->xmin, xmax); - e->xmax = xmax; - } - laste = e; - } - - R->anchor = anchor.link; - - return(R); -} - -#ifdef notdef -/* -:h3.CoerceRegion() - Force a TextPath Structure to Become a Region - -We also save the newly created region in the textpath structure, if the -structure was permanent. Then we don't have to do this again. Why not -save it all the time? Well, we certainly could, but I suspect it -wouldn't pay. We would have to make this region permanent (because we -couldn't have it be consumed) and this would probably require -unnecessary CopyRegions in most cases. -*/ - -struct region * -CoerceRegion(struct textpath *tp) /* input TEXTTYPE */ -{ - struct segment *path; /* temporary character path */ - struct region *R; /* returned region */ - - - R = Interior(path, EVENODDRULE); - return(R); -} -#endif - -/* -:h3.RegionBounds() - Returns Bounding Box of a Region -*/ - -struct segment * -RegionBounds(struct region *R) -{ - register struct segment *path; /* returned path */ - - path = BoxPath(IDENTITY, R->ymax - R->ymin, R->xmax - R->xmin); - path = Join(PathSegment(MOVETYPE, R->origin.x + TOFRACTPEL(R->xmin), - R->origin.y + TOFRACTPEL(R->ymin) ), - path); - return(path); -} - -/* -:h2.Formatting/Dump Routines for Debug - -:h3.DumpArea() - Display a Region -*/ -void -DumpArea(struct region *area) -{ - DumpEdges(area->anchor); -} - -#define INSWATH(p, y0, y1) (p != NULL && p->ymin == y0 && p->ymax == y1) -/* -:h3.DumpEdges() - Display Run End Lists (Edge Lists) -*/ - -/* -:h3.edgecheck() - For Debug, Verify that an Edge Obeys the Rules -*/ - -/*ARGSUSED*/ -static void -edgecheck(struct edgelist *edge, int oldmin, int oldmax) -{ - if (edge->type != EDGETYPE) - Abort("EDGE ERROR: non EDGETYPE in list"); -/* -The following check is not valid if the region is jumbled so I took it -out: -*/ -/* if (edge->ymin < oldmax && edge->ymin != oldmin) - Abort("EDGE ERROR: overlapping swaths"); */ -} - -void -DumpEdges(struct edgelist *edges) -{ - register struct edgelist *p,*p2; - register pel ymin = MINPEL; - register pel ymax = MINPEL; - - if (edges == NULL) { - return; - } - if (RegionDebug <= 1) { - for (p=edges; p != NULL; p = p->link) { - edgecheck(p, ymin, ymax); - ymin = p->ymin; ymax = p->ymax; - } - } - else { - - for (p2=edges; p2 != NULL; ) { - - edgecheck(p2, ymin, ymax); - ymin = p2->ymin; - ymax = p2->ymax; - - while (INSWATH(p2, ymin, ymax)) - p2 = p2->link; - } - } -} diff --git a/nx-X11/lib/font/Type1/regions.h b/nx-X11/lib/font/Type1/regions.h deleted file mode 100644 index 96ad1a53a..000000000 --- a/nx-X11/lib/font/Type1/regions.h +++ /dev/null @@ -1,250 +0,0 @@ -/* $Xorg: regions.h,v 1.3 2000/08/17 19:46:32 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/regions.h,v 1.7 2001/01/17 19:43:23 dawes Exp $ */ -/*SHARED*/ - -#define Interior(p,rule) t1_Interior(p,rule) -#define Union(a1,a2) t1_Union(a1,a2) -#define Intersect(a1,a2) t1_Intersect(a1,a2) -#define Complement(area) t1_Complement(area) -#define Overlap(a1,a2) t1_OverLap(a1,a2) - - -/* returns the interior of a closed path */ -extern struct region *t1_Interior ( struct segment *p, int fillrule ); -#if 0 -struct region *t1_Union(); /* set union of paths or regions */ -struct region *t1_Intersect(); /* set intersection of regions */ -struct region *t1_Complement(); /* complement of a region */ -int t1_Overlap(); /* returns a Boolean; TRUE if regions overlap */ -#endif - -#define TT_INFINITY t1_Infinity - -/*END SHARED*/ -/*SHARED*/ - -#define ChangeDirection(type,R,x,y,dy) t1_ChangeDirection(type,R,x,y,dy) - -/* called when we change direction in Y */ -extern void t1_ChangeDirection ( int type, struct region *R, fractpel x, - fractpel y, fractpel dy ); -#define CD_FIRST -1 /* enumeration of ChangeDirection type */ -#define CD_CONTINUE 0 /* enumeration of ChangeDirection type */ -#define CD_LAST 1 /* enumeration of ChangeDirection type */ - -#define MoreWorkArea(R,x1,y1,x2,y2) t1_MoreWorkArea(R,x1,y1,x2,y2) -#define KillRegion(area) t1_KillRegion(area) -#define CopyRegion(area) t1_CopyRegion(area) -#define BoxClip(R,xmin,ymin,xmax,ymax) t1_BoxClip(R,xmin,ymin,xmax,ymax) -#define SortSwath(a,p,f) t1_SortSwath(a,p,f) -#define SwathUnion(b,e) t1_SwathUnion(b,e) -#define RegionBounds(r) t1_RegionBounds(r) -#define CoerceRegion(p) t1_CoerceRegion(p) -#define MoveEdges(R,dx,dy) t1_MoveEdges(R,dx,dy) -#define UnJumble(R) t1_UnJumble(R) - -typedef struct edgelist *(*SwathFunc)(struct edgelist *, struct edgelist *); - -/* get longer edge list for stepping */ -extern void t1_MoreWorkArea ( struct region *R, fractpel x1, fractpel y1, - fractpel x2, fractpel y2 ); -/* duplicate a region */ -extern struct region *t1_CopyRegion ( struct region *area ); -/* destroy a region */ -extern void t1_KillRegion ( struct region *area ); -/* clip a region to a rectangle */ -extern struct region *t1_BoxClip ( struct region *R, pel xmin, pel ymin, - pel xmax, pel ymax ); -/* sort edges onto growing edge list */ -extern struct edgelist *t1_SortSwath ( struct edgelist *anchor, - struct edgelist *edge, - SwathFunc swathfcn ); -/* 'union' two edges into a swath */ -extern struct edgelist *t1_SwathUnion ( struct edgelist *before0, - struct edgelist *edge ); -/* returns bounding box of a region */ -extern struct segment *t1_RegionBounds ( struct region *R ); -#ifdef notdef -/* force text to become a true region */ -struct region *t1_CoerceRegion(struct textpath *tp); -#endif -/* moves the edge values in a region */ -extern void t1_MoveEdges ( struct region *R, fractpel dx, fractpel dy ); -/* sort the edges and reset the jumbled flag */ -extern void t1_UnJumble ( struct region *region ); - - -/*END SHARED*/ -/*SHARED*/ - -#define GOING_TO(R, x1, y1, x2, y2, dy) { \ - if (dy < 0) { \ - if (R->lastdy >= 0) \ - ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ - if (y2 < R->edgeYstop) \ - MoreWorkArea(R, x1, y1, x2, y2); \ - } \ - else if (dy > 0) { \ - if (R->lastdy <= 0) \ - ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ - if (y2 > R->edgeYstop) \ - MoreWorkArea(R, x1, y1, x2, y2); \ - } \ - else /* dy == 0 */ ChangeDirection(CD_CONTINUE, R, x1, y1, dy); \ - if (x2 < R->edgexmin) R->edgexmin = x2; \ - else if (x2 > R->edgexmax) R->edgexmax = x2; \ -} - -#ifndef FONTMODULE -#ifndef __sxg__ -#include -#endif -#endif -#ifdef SHRT_MIN -#define MINPEL SHRT_MIN -#else -#define MINPEL ((pel)(-1<<(8*sizeof(pel)-1))) /* smallest value fitting in a pel */ -#endif -#ifdef SHRT_MAX -#define MAXPEL SHRT_MAX -#else -#define MAXPEL ((pel)((1<<(8*sizeof(pel)-1))-1))/* largest value fitting in a pel */ -#endif - -/* -The "Unique"-type macro is different (unique?) for regions, because some -regions structures are shared among several objects, and might have -to be made unique for that reason (i.e., references > 1). -*/ - -#define ConsumeRegion(R) MAKECONSUME(R,KillRegion(R)) -#define UniqueRegion(R) MAKEUNIQUE(R,CopyRegion(R)) - - -/*END SHARED*/ -/*SHARED*/ - -typedef void (*NewEdgeFunc)(struct region *, - fractpel, fractpel, fractpel, fractpel, int); - -struct region { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - /* type = REGIONTYPE */ - struct fractpoint origin; /* beginning handle: X,Y origin of region */ - struct fractpoint ending; /* ending handle: X,Y change after painting region */ - pel xmin,ymin; /* minimum X,Y of region */ - pel xmax,ymax; /* mat1_mum X,Y of region */ - struct edgelist *anchor; /* list of edges that bound the region */ - struct picture *thresholded; /* region defined by thresholded picture*/ -/* -Note that the ending handle and the bounding box values are stored -relative to 'origin'. - -The above elements describe a region. The following elements are -scratchpad areas used while the region is being built: -*/ - fractpel lastdy; /* direction of last segment */ - fractpel firstx,firsty; /* starting point of current edge */ - fractpel edgexmin,edgexmax; /* x extent of current edge */ - struct edgelist *lastedge,*firstedge; /* last and first edges in subpath */ - pel *edge; /* pointer to array of X values for edge */ - fractpel edgeYstop; /* Y value where 'edges' array ends */ - NewEdgeFunc newedgefcn; /* function to use when building a new edge */ - struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */ -} ; -/* -The ISCOMPLEMENT flag indicates the region is reversed--it is the -"outside" of the nominal region. -*/ -#define ISCOMPLEMENT(flag) ((flag)&0x80) -/* -The ISJUMBLED flag indicates the region is not sorted top-to-bottom. -*/ -#define ISJUMBLED(flag) ((flag)&0x40) -/* -The ISINFINITE flag allows a quick check for an INFINITE region, which -is frequently intersected. -*/ -#define ISINFINITE(flag) ((flag)&0x20) - -/*END SHARED*/ -/*SHARED*/ - -#define ISRECTANGULAR(flag) ((flag)&0x08) - -/*END SHARED*/ -/*SHARED*/ - -#define EmptyRegion t1_EmptyRegion - -/*END SHARED*/ -/*SHARED*/ - -struct edgelist { - XOBJ_COMMON /* xobject common data define 3-26-91 PNM */ - /* type = EDGETYPE */ - struct edgelist *link; /* pointer to next in linked list */ - struct edgelist *subpath; /* informational link for "same subpath" */ - pel xmin,xmax; /* range of edge in X */ - pel ymin,ymax; /* range of edge in Y */ - pel *xvalues; /* pointer to ymax-ymin X values */ -} ; -/* -The end of the list is marked by either "link" being NULL, or by -ymin == ymax. See :hdref refid=discard.. We define the VALIDEDGE -predicate to test for the opposite of these conditions: -*/ - -#define VALIDEDGE(p) ((p)!=NULL&&(p)->ymin<(p)->ymax) - -/*END SHARED*/ -/*SHARED*/ - -#define ISDOWN(f) ((f)&0x80) - -#define ISAMBIGUOUS(f) ((f)&0x40) - -/*END SHARED*/ -/*SHARED*/ - -/* -Interior() rule enumerations: -*/ -#define WINDINGRULE -2 -#define EVENODDRULE -3 - -#define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ - -/*END SHARED*/ - -/* dump a region structure */ -extern void t1_DumpArea ( struct region *area ); -/* dump a region's edge list */ -extern void t1_DumpEdges ( struct edgelist *edges ); diff --git a/nx-X11/lib/font/Type1/scanfont.c b/nx-X11/lib/font/Type1/scanfont.c deleted file mode 100644 index 8db497959..000000000 --- a/nx-X11/lib/font/Type1/scanfont.c +++ /dev/null @@ -1,2370 +0,0 @@ -/* $XdotOrg: xc/lib/font/Type1/scanfont.c,v 1.5 2005/07/09 23:30:06 keithp Exp $ */ -/* $Xorg: scanfont.c,v 1.3 2000/08/17 19:46:32 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ -/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/scanfont.c,v 1.16 2003/05/27 22:26:46 tsi Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include -#include -#else -#include "Xdefs.h" /* Bool declaration */ -#include "Xmd.h" /* INT32 declaration */ -#include "xf86_ansic.h" -#endif -#include "t1stdio.h" -#include "util.h" -#include "token.h" -#if XFONT_CID -#include "range.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "fontfcn.h" -#include "blues.h" - -#if XFONT_CID -#define CID_BUFSIZE 80 - -extern psfont *FDArrayP; -static spacerange *spacerangeP; -static cidrange *notdefrangeP; -static cidrange *cidrangeP; -extern int FDArrayIndex; -static boolean CIDWantFontInfo; -static psobj inputFile1; -#endif - -static int rc; -static boolean InPrivateDict; -static boolean WantFontInfo; -static boolean TwoSubrs; -static psobj inputFile; -static psobj filterFile; -static psobj *inputP; - - -/**********************************************************************/ -/* Init_BuiltInEncoding() */ -/* */ -/* Initializes the StandardEncoding and ISOLatin1Encoding vector. */ -/* */ -/**********************************************************************/ -typedef struct /* Builtin Standard Encoding */ -{ - int index; - char *name; -} EncodingTable; - -static EncodingTable StdEnc[] = { - { 040 , "space" }, - { 041 , "exclam" }, - { 042 , "quotedbl" }, - { 043 , "numbersign" }, - { 044 , "dollar" }, - { 045 , "percent" }, - { 046 , "ampersand" }, - { 047 , "quoteright" }, - { 050 , "parenleft" }, - { 051 , "parenright" }, - { 052 , "asterisk" }, - { 053 , "plus" }, - { 054 , "comma" }, - { 055 , "hyphen" }, - { 056 , "period" }, - { 057 , "slash" }, - { 060 , "zero" }, - { 061 , "one" }, - { 062 , "two" }, - { 063 , "three" }, - { 064 , "four" }, - { 065 , "five" }, - { 066 , "six" }, - { 067 , "seven" }, - { 070 , "eight" }, - { 071 , "nine" }, - { 072 , "colon" }, - { 073 , "semicolon" }, - { 074 , "less" }, - { 075 , "equal" }, - { 076 , "greater" }, - { 077 , "question" }, - { 0100 , "at" }, - { 0101 , "A" }, - { 0102 , "B" }, - { 0103 , "C" }, - { 0104 , "D" }, - { 0105 , "E" }, - { 0106 , "F" }, - { 0107 , "G" }, - { 0110 , "H" }, - { 0111 , "I" }, - { 0112 , "J" }, - { 0113 , "K" }, - { 0114 , "L" }, - { 0115 , "M" }, - { 0116 , "N" }, - { 0117 , "O" }, - { 0120 , "P" }, - { 0121 , "Q" }, - { 0122 , "R" }, - { 0123 , "S" }, - { 0124 , "T" }, - { 0125 , "U" }, - { 0126 , "V" }, - { 0127 , "W" }, - { 0130 , "X" }, - { 0131 , "Y" }, - { 0132 , "Z" }, - { 0133 , "bracketleft" }, - { 0134 , "backslash" }, - { 0135 , "bracketright" }, - { 0136 , "asciicircum" }, - { 0137 , "underscore" }, - { 0140 , "quoteleft" }, - { 0141 , "a" }, - { 0142 , "b" }, - { 0143 , "c" }, - { 0144 , "d" }, - { 0145 , "e" }, - { 0146 , "f" }, - { 0147 , "g" }, - { 0150 , "h" }, - { 0151 , "i" }, - { 0152 , "j" }, - { 0153 , "k" }, - { 0154 , "l" }, - { 0155 , "m" }, - { 0156 , "n" }, - { 0157 , "o" }, - { 0160 , "p" }, - { 0161 , "q" }, - { 0162 , "r" }, - { 0163 , "s" }, - { 0164 , "t" }, - { 0165 , "u" }, - { 0166 , "v" }, - { 0167 , "w" }, - { 0170 , "x" }, - { 0171 , "y" }, - { 0172 , "z" }, - { 0173 , "braceleft" }, - { 0174 , "bar" }, - { 0175 , "braceright" }, - { 0176 , "asciitilde" }, - { 0241 , "exclamdown" }, - { 0242 , "cent" }, - { 0243 , "sterling" }, - { 0244 , "fraction" }, - { 0245 , "yen" }, - { 0246 , "florin" }, - { 0247 , "section" }, - { 0250 , "currency" }, - { 0251 , "quotesingle" }, - { 0252 , "quotedblleft" }, - { 0253 , "guillemotleft" }, - { 0254 , "guilsinglleft" }, - { 0255 , "guilsinglright" }, - { 0256 , "fi" }, - { 0257 , "fl" }, - { 0261 , "endash" }, - { 0262 , "dagger" }, - { 0263 , "daggerdbl" }, - { 0264 , "periodcentered" }, - { 0266 , "paragraph" }, - { 0267 , "bullet" }, - { 0270 , "quotesinglbase" }, - { 0271 , "quotedblbase" }, - { 0272 , "quotedblright" }, - { 0273 , "guillemotright" }, - { 0274 , "ellipsis" }, - { 0275 , "perthousand" }, - { 0277 , "questiondown" }, - { 0301 , "grave" }, - { 0302 , "acute" }, - { 0303 , "circumflex" }, - { 0304 , "tilde" }, - { 0305 , "macron" }, - { 0306 , "breve" }, - { 0307 , "dotaccent" }, - { 0310 , "dieresis" }, - { 0312 , "ring" }, - { 0313 , "cedilla" }, - { 0315 , "hungarumlaut" }, - { 0316 , "ogonek" }, - { 0317 , "caron" }, - { 0320 , "emdash" }, - { 0341 , "AE" }, - { 0343 , "ordfeminine" }, - { 0350 , "Lslash" }, - { 0351 , "Oslash" }, - { 0352 , "OE" }, - { 0353 , "ordmasculine" }, - { 0361 , "ae" }, - { 0365 , "dotlessi" }, - { 0370 , "lslash" }, - { 0371 , "oslash" }, - { 0372 , "oe" }, - { 0373 , "germandbls" }, - { 0, 0 } -}; - -static EncodingTable ISO8859Enc[] = { - { 32, "space" }, - { 33, "exclam" }, - { 34, "quotedbl" }, - { 35, "numbersign" }, - { 36, "dollar" }, - { 37, "percent" }, - { 38, "ampersand" }, - { 39, "quoteright" }, - { 40, "parenleft" }, - { 41, "parenright" }, - { 42, "asterisk" }, - { 43, "plus" }, - { 44, "comma" }, - { 45, "minus" }, - { 46, "period" }, - { 47, "slash" }, - { 48, "zero" }, - { 49, "one" }, - { 50, "two" }, - { 51, "three" }, - { 52, "four" }, - { 53, "five" }, - { 54, "six" }, - { 55, "seven" }, - { 56, "eight" }, - { 57, "nine" }, - { 58, "colon" }, - { 59, "semicolon" }, - { 60, "less" }, - { 61, "equal" }, - { 62, "greater" }, - { 63, "question" }, - { 64, "at" }, - { 65, "A" }, - { 66, "B" }, - { 67, "C" }, - { 68, "D" }, - { 69, "E" }, - { 70, "F" }, - { 71, "G" }, - { 72, "H" }, - { 73, "I" }, - { 74, "J" }, - { 75, "K" }, - { 76, "L" }, - { 77, "M" }, - { 78, "N" }, - { 79, "O" }, - { 80, "P" }, - { 81, "Q" }, - { 82, "R" }, - { 83, "S" }, - { 84, "T" }, - { 85, "U" }, - { 86, "V" }, - { 87, "W" }, - { 88, "X" }, - { 89, "Y" }, - { 90, "Z" }, - { 91, "bracketleft" }, - { 92, "backslash" }, - { 93, "bracketright" }, - { 94, "asciicircum" }, - { 95, "underscore" }, - { 96, "quoteleft" }, - { 97, "a" }, - { 98, "b" }, - { 99, "c" }, - { 100, "d" }, - { 101, "e" }, - { 102, "f" }, - { 103, "g" }, - { 104, "h" }, - { 105, "i" }, - { 106, "j" }, - { 107, "k" }, - { 108, "l" }, - { 109, "m" }, - { 110, "n" }, - { 111, "o" }, - { 112, "p" }, - { 113, "q" }, - { 114, "r" }, - { 115, "s" }, - { 116, "t" }, - { 117, "u" }, - { 118, "v" }, - { 119, "w" }, - { 120, "x" }, - { 121, "y" }, - { 122, "z" }, - { 123, "braceleft" }, - { 124, "bar" }, - { 125, "braceright" }, - { 126, "asciitilde" }, - { 160, "space" }, - { 161, "exclamdown" }, - { 162, "cent" }, - { 163, "sterling" }, - { 164, "currency" }, - { 165, "yen" }, - { 166, "brokenbar" }, - { 167, "section" }, - { 168, "dieresis" }, - { 169, "copyright" }, - { 170, "ordfeminine" }, - { 171, "guillemotleft" }, - { 172, "logicalnot" }, - { 173, "hyphen" }, - { 174, "registered" }, - { 175, "macron" }, - { 176, "degree" }, - { 177, "plusminus" }, - { 178, "twosuperior" }, - { 179, "threesuperior" }, - { 180, "acute" }, - { 181, "mu" }, - { 182, "paragraph" }, - { 183, "periodcentered" }, - { 184, "cedilla" }, - { 185, "onesuperior" }, - { 186, "ordmasculine" }, - { 187, "guillemotright" }, - { 188, "onequarter" }, - { 189, "onehalf" }, - { 190, "threequarters" }, - { 191, "questiondown" }, - { 192, "Agrave" }, - { 193, "Aacute" }, - { 194, "Acircumflex" }, - { 195, "Atilde" }, - { 196, "Adieresis" }, - { 197, "Aring" }, - { 198, "AE" }, - { 199, "Ccedilla" }, - { 200, "Egrave" }, - { 201, "Eacute" }, - { 202, "Ecircumflex" }, - { 203, "Edieresis" }, - { 204, "Igrave" }, - { 205, "Iacute" }, - { 206, "Icircumflex" }, - { 207, "Idieresis" }, - { 208, "Eth" }, - { 209, "Ntilde" }, - { 210, "Ograve" }, - { 211, "Oacute" }, - { 212, "Ocircumflex" }, - { 213, "Otilde" }, - { 214, "Odieresis" }, - { 215, "multiply" }, - { 216, "Oslash" }, - { 217, "Ugrave" }, - { 218, "Uacute" }, - { 219, "Ucircumflex" }, - { 220, "Udieresis" }, - { 221, "Yacute" }, - { 222, "Thorn" }, - { 223, "germandbls" }, - { 224, "agrave" }, - { 225, "aacute" }, - { 226, "acircumflex" }, - { 227, "atilde" }, - { 228, "adieresis" }, - { 229, "aring" }, - { 230, "ae" }, - { 231, "ccedilla" }, - { 232, "egrave" }, - { 233, "eacute" }, - { 234, "ecircumflex" }, - { 235, "edieresis" }, - { 236, "igrave" }, - { 237, "iacute" }, - { 238, "icircumflex" }, - { 239, "idieresis" }, - { 240, "eth" }, - { 241, "ntilde" }, - { 242, "ograve" }, - { 243, "oacute" }, - { 244, "ocircumflex" }, - { 245, "otilde" }, - { 246, "odieresis" }, - { 247, "divide" }, - { 248, "oslash" }, - { 249, "ugrave" }, - { 250, "uacute" }, - { 251, "ucircumflex" }, - { 252, "udieresis" }, - { 253, "yacute" }, - { 254, "thorn" }, - { 255, "ydieresis" }, - { 0, 0 } -}; - -static psobj *StdEncArrayP = NULL; -psobj *ISOLatin1EncArrayP = NULL; - -static psobj * -MakeEncodingArrayP(EncodingTable *encodingTable) -{ - int i; - psobj *encodingArrayP; - - encodingArrayP = (psobj *)vm_alloc(256*(sizeof(psobj))); - if (!encodingArrayP) - return NULL; - - /* initialize everything to .notdef */ - for (i=0; i<256;i++) - objFormatName(&(encodingArrayP[i]),7, ".notdef"); - - for (i=0; encodingTable[i].name; i++) - { - objFormatName(&(encodingArrayP[encodingTable[i].index]), - strlen(encodingTable[i].name), - encodingTable[i].name); - } - - return(encodingArrayP); -} - -boolean -Init_BuiltInEncoding(void) -{ - StdEncArrayP = MakeEncodingArrayP(StdEnc); - ISOLatin1EncArrayP = MakeEncodingArrayP(ISO8859Enc); - return (StdEncArrayP && ISOLatin1EncArrayP); -} - -/********************************************************************/ -/***================================================================***/ -static int -getNextValue(int valueType) -{ - scan_token(inputP); - if (tokenType != valueType) { - return(SCAN_ERROR); - } - return(SCAN_OK); - -} -/***================================================================***/ -/* This routine will set the global rc if there is an error */ -/***================================================================***/ -static int -getInt(void) -{ - scan_token(inputP); - if (tokenType != TOKEN_INTEGER) { - rc = SCAN_ERROR; - return(0); - } - else { - return( tokenValue.integer); - } - -} -/***================================================================***/ -/* - * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1, - * for parsing Encoding. - */ -static int -getEncoding(psobj *arrayP) -{ - scan_token(inputP); - if ((tokenType == TOKEN_NAME && (tokenLength==16 || tokenLength==17))) - { - if((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) - arrayP->data.valueP = (char *) StdEncArrayP; - else - arrayP->data.valueP = (char *) ISOLatin1EncArrayP; - arrayP->len = 256; - return(SCAN_OK); - } - else if ( (tokenType == TOKEN_LEFT_BRACE) || - (tokenType == TOKEN_LEFT_BRACKET) ) - { - /* Array of literal names */ - - psobj *objP; - int i; - - objP = (psobj *)vm_alloc(256*(sizeof(psobj))); - if (!(objP)) return(SCAN_OUT_OF_MEMORY); - - arrayP->data.valueP = (char *) objP; - arrayP->len = 256; - - for (i=0; i<256; i++, objP++) - { - scan_token(inputP); - - if (tokenType != TOKEN_LITERAL_NAME) - return(SCAN_ERROR); - - if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); - objFormatName(objP,tokenLength,tokenStartP); - } - - scan_token(inputP); - if ( (tokenType == TOKEN_RIGHT_BRACE) || - (tokenType == TOKEN_RIGHT_BRACKET) ) - return(SCAN_OK); - } - else - { - /* Must be sequences of ``dup put" */ - - psobj *objP; - int i; - - objP = (psobj *)vm_alloc(256*(sizeof(psobj))); - if (!(objP)) return(SCAN_OUT_OF_MEMORY); - - arrayP->data.valueP = (char *) objP; - arrayP->len = 256; - - for (i=0; i<256; i++) - objFormatName(objP + i, 7, ".notdef"); - - while (TRUE) - { - scan_token(inputP); - - switch (tokenType) - { - case TOKEN_NAME: - if (tokenLength == 3) - { - if (strncmp(tokenStartP,"dup",3) == 0) - { - /* get */ - scan_token(inputP); - if (tokenType != TOKEN_INTEGER || - tokenValue.integer < 0 || - tokenValue.integer > 255) - return (SCAN_ERROR); - i = tokenValue.integer; - - /* get */ - scan_token(inputP); - if (tokenType != TOKEN_LITERAL_NAME) - return(SCAN_ERROR); - - if (!(vm_alloc(tokenLength)) ) - return(SCAN_OUT_OF_MEMORY); - objFormatName(objP + i,tokenLength,tokenStartP); - - /* get "put" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME) - return(SCAN_ERROR); - } - else if (strncmp(tokenStartP,"def",3) == 0) - return (SCAN_OK); - } - break; - case TOKEN_EOF: - case TOKEN_NONE: - case TOKEN_INVALID: - return (SCAN_ERROR); - } - } - } - - return (SCAN_ERROR); -} -/***================================================================***/ -#if XFONT_CID -static int -getFDArray(psobj *arrayP) -{ - int rc; - - /* get the number of items in the FDArray */ - scan_token(inputP); - if (tokenType == TOKEN_INTEGER) { - /* an FD array must contain at least one element */ - if (tokenValue.integer <= 0) - return(SCAN_ERROR); - arrayP->len = tokenValue.integer; - } else - return(SCAN_ERROR); - - /* get the token "array" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "array", 5) != 0) - return(SCAN_ERROR); - - /* format the array in memory, save pointer to the beginning */ - arrayP->data.valueP = tokenStartP; - - /* allocate FDArray */ - /* No integer overflow since arrayP->len is unsigned short */ - FDArrayP = (psfont *)vm_alloc(arrayP->len*(sizeof(psfont))); - if (!(FDArrayP)) return(SCAN_OUT_OF_MEMORY); - - /* get a specified number of font dictionaries */ - for (FDArrayIndex = 0; FDArrayIndex < arrayP->len; FDArrayIndex++) { - /* get "dup" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "dup", 3) != 0) - return(SCAN_ERROR); - /* get an integer digit */ - scan_token(inputP); - if (tokenType != TOKEN_INTEGER) - return(SCAN_ERROR); - - /* read a CID version of a Type 1 font */ - if (!CIDType1fontfcnA(&rc)) - return(rc); - - /* get "put" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || strncmp(tokenStartP, "put", 3) != 0) - return(SCAN_ERROR); - } - return(SCAN_OK); -} -#endif - -static int -getArray(psobj *arrayP) -{ - int N; /* count the items in the array */ - psobj *objP; - - /* That is totally a kludge. If some stupid font file has - * /foo/foo # ftp://ftp.cdrom.com/pub/os2/fonts/future.zip - * we will treat it as /foo. - * H.J. */ - char tmp [1024]; - - strncpy (tmp, tokenStartP, sizeof (tmp)); - tmp [sizeof (tmp) - 1] = '\0'; - -restart: - scan_token(inputP); - switch (tokenType) - { - case TOKEN_LEFT_BRACE: - case TOKEN_LEFT_BRACKET: - break; - - case TOKEN_LITERAL_NAME: - tokenStartP[tokenLength] = '\0'; - if (strcmp (tokenStartP, tmp) == 0) - { - /* Ok, We see /foo/foo. Let's restart. */ - goto restart; - } - - default: - return(SCAN_ERROR); - } - /* format the array in memory, save pointer to the beginning */ - arrayP->data.valueP = tokenStartP; - /* loop, picking up next object, until right BRACE or BRACKET */ - N = 0; - do { - scan_token(inputP); - if ( (tokenType == TOKEN_RIGHT_BRACE) || - (tokenType == TOKEN_RIGHT_BRACKET) ) { - /* save then number of items in the array */ - arrayP->len = N; - return(SCAN_OK); - } - /* allocate the space for the object */ - objP = (psobj *)vm_alloc(sizeof(psobj)); - if (!(objP)) return(SCAN_OUT_OF_MEMORY); - - /* array is an array of numbers, (real or integer) */ - if (tokenType == TOKEN_REAL) { - objFormatReal(objP, tokenValue.real); - } - else - if (tokenType == TOKEN_INTEGER) { - objFormatInteger(objP, tokenValue.integer); - } - else return(SCAN_ERROR); - N++; - } while ( 1>0 ); - /* NOTREACHED*/ -} -/***================================================================***/ -static int -getName(char *nameP) -{ - do { - scan_token(inputP); - if (tokenType <= TOKEN_NONE) { - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - return(SCAN_ERROR); - } - } while ((tokenType != TOKEN_NAME) || - (0 != strncmp(tokenStartP,nameP,strlen(nameP))) ); - /* found */ - return(SCAN_OK); -} -/***================================================================***/ -static int -getNbytes(int N) -{ - int I; - - - tokenStartP = vm_next_byte(); - tokenMaxP = tokenStartP + MIN(vm_free_bytes(), MAX_STRING_LEN); - if (N > vm_free_bytes()) { - return(SCAN_OUT_OF_MEMORY); - } - I = T1Read(tokenStartP,1,N,inputP->data.fileP); - if ( I != N ) return(SCAN_FILE_EOF); - return(SCAN_OK); -} - -/***================================================================***/ -/* getLiteralName(nameObjP) */ -/* scan for next literal. */ -/* if we encounter the name 'end' then terminate and say ok. */ -/* It means that the CharStrings does not have as many characters */ -/* as the dictionary said it would and that is ok. */ -/***================================================================***/ -static int -getLiteralName(psobj *nameObjP) -{ - do { - scan_token(inputP); - if (tokenType <= TOKEN_NONE) { - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - return(SCAN_ERROR); - } - if (tokenType == TOKEN_NAME) { - if (0 == strncmp(tokenStartP,"end",3) ) { - return(SCAN_END); - } - } - } while (tokenType != TOKEN_LITERAL_NAME) ; - nameObjP->len = tokenLength; - /* allocate all the names in the CharStrings Structure */ - if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); - nameObjP->data.valueP = tokenStartP; - /* found */ - return(SCAN_OK); -} - -/***================================================================***/ -/* - * BuildSubrs routine - */ -/***================================================================***/ - -static int -BuildSubrs(psfont *FontP) -{ - int N; /* number of values in Subrs */ - int I; /* index into Subrs */ - int i; /* loop thru Subrs */ - int J; /* length of Subrs entry */ - psobj *arrayP; - - /* next token should be a positive int */ - /* note: rc is set by getInt. */ - N = getInt(); - if (rc) return(rc); - if (N < 0 ) return(SCAN_ERROR); - /* if we already have a Subrs, then skip the second one */ - /* The second one is for hiresolution devices. */ - if (FontP->Subrs.data.arrayP != NULL) { - TwoSubrs = TRUE; - /* process all the Subrs, but do not update anything */ - /* can not just skip them because of the binary data */ - for (i=0;i INT_MAX / sizeof(psobj)) - return (SCAN_ERROR); - arrayP = (psobj *)vm_alloc(N*sizeof(psobj)); - if (!(arrayP) ) return(SCAN_OUT_OF_MEMORY); - FontP->Subrs.len = N; - FontP->Subrs.data.arrayP = arrayP; - /* get N values for Subrs */ - for (i=0;i INT_MAX / sizeof(psdict)) return(SCAN_ERROR); - /* save number of entries in the dictionary */ - - dictP = (psdict *)vm_alloc((N+1)*sizeof(psdict)); - if (!(dictP)) return(SCAN_OUT_OF_MEMORY); - FontP->CharStringsP = dictP; - dictP[0].key.len = N; - /* get N values for CharStrings */ - for (i=1;i<=N;i++) { - /* look for next literal name */ - rc = getLiteralName(&(dictP[i].key)); - if (rc) return(rc); - /* get 1 integer */ - J = getInt(); - if (rc) return(rc); /* if next token was not an Int */ - if (J<0) return (SCAN_ERROR); - dictP[i].value.len = J; - /* get the next token, it should be RD or -|, either is ok */ - rc = getNextValue(TOKEN_NAME); - if ( rc != SCAN_OK ) return(rc); - rc = getNbytes(J); - if (rc == SCAN_OK) { - dictP[i].value.data.valueP = tokenStartP; - if ( !(vm_alloc(J)) ) return(SCAN_OUT_OF_MEMORY); - } - else return(rc); - } - return(SCAN_OK); - -} -/***================================================================***/ -#if XFONT_CID -/***================================================================***/ -/* - * BuildCIDFontInfo Dictionary - */ -/***================================================================***/ -static int -BuildCIDFontInfo(cidfont *CIDfontP) -{ - psdict *dictP; - - /* allocate the private dictionary (max number of entries + 1) */ - dictP = (psdict *)vm_alloc(20*sizeof(psdict)); - if (!(dictP)) return(SCAN_OUT_OF_MEMORY); - - CIDfontP->CIDfontInfoP = dictP; - CIDfontP->CIDfontInfoP[0].key.len = 18; /* number of actual entries */ - objFormatName(&(dictP[CIDCOUNT].key),8,"CIDCount"); - objFormatInteger(&(dictP[CIDCOUNT].value),-1); - objFormatName(&(dictP[CIDFONTNAME].key),11,"CIDFontName"); - objFormatName(&(dictP[CIDFONTNAME].value),0,NULL); - objFormatName(&(dictP[CIDFONTTYPE].key),11,"CIDFontType"); - objFormatInteger(&(dictP[CIDFONTTYPE].value),-1); - objFormatName(&(dictP[CIDVERSION].key),14,"CIDFontVersion"); - objFormatInteger(&(dictP[CIDVERSION].value),-1); - objFormatName(&(dictP[CIDREGISTRY].key),8,"Registry"); - objFormatString(&(dictP[CIDREGISTRY].value),0,NULL); - objFormatName(&(dictP[CIDORDERING].key),8,"Ordering"); - objFormatString(&(dictP[CIDORDERING].value),0,NULL); - objFormatName(&(dictP[CIDSUPPLEMENT].key),10,"Supplement"); - objFormatInteger(&(dictP[CIDSUPPLEMENT].value),-1); - objFormatName(&(dictP[CIDMAPOFFSET].key),12,"CIDMapOffset"); - objFormatInteger(&(dictP[CIDMAPOFFSET].value),-1); - objFormatName(&(dictP[CIDFDARRAY].key),7,"FDArray"); - objFormatArray(&(dictP[CIDFDARRAY].value),0,NULL); - objFormatName(&(dictP[CIDFDBYTES].key),7,"FDBytes"); - objFormatInteger(&(dictP[CIDFDBYTES].value),-1); - objFormatName(&(dictP[CIDFONTBBOX].key),8,"FontBBox"); - objFormatArray(&(dictP[CIDFONTBBOX].value),0,NULL); - objFormatName(&(dictP[CIDFULLNAME].key),8,"FullName"); - objFormatString(&(dictP[CIDFULLNAME].value),0,NULL); - objFormatName(&(dictP[CIDFAMILYNAME].key),10,"FamilyName"); - objFormatString(&(dictP[CIDFAMILYNAME].value),0,NULL); - objFormatName(&(dictP[CIDWEIGHT].key),6,"Weight"); - objFormatString(&(dictP[CIDWEIGHT].value),0,NULL); - objFormatName(&(dictP[CIDNOTICE].key),6,"Notice"); - objFormatString(&(dictP[CIDNOTICE].value),0,NULL); - objFormatName(&(dictP[CIDGDBYTES].key),7,"GDBytes"); - objFormatInteger(&(dictP[CIDGDBYTES].value),-1); - objFormatName(&(dictP[CIDUIDBASE].key),7,"UIDBase"); - objFormatInteger(&(dictP[CIDUIDBASE].value),0); - objFormatName(&(dictP[CIDXUID].key),4,"XUID"); - objFormatInteger(&(dictP[CIDXUID].value),0); - return(SCAN_OK); -} -/***================================================================***/ -/* - * BuildCMapInfo Dictionary - */ -/***================================================================***/ -static int -BuildCMapInfo(cmapres *CMapP) -{ - psdict *dictP; - - /* allocate the private dictionary (max number of entries + 1) */ - dictP = (psdict *)vm_alloc(20*sizeof(psdict)); - if (!(dictP)) return(SCAN_OUT_OF_MEMORY); - - CMapP->CMapInfoP = dictP; - CMapP->CMapInfoP[0].key.len = 8; /* number of actual entries */ - objFormatName(&(dictP[CMAPREGISTRY].key),8,"Registry"); - objFormatString(&(dictP[CMAPREGISTRY].value),0,NULL); - objFormatName(&(dictP[CMAPORDERING].key),8,"Ordering"); - objFormatString(&(dictP[CMAPORDERING].value),0,NULL); - objFormatName(&(dictP[CMAPSUPPLEMENT].key),10,"Supplement"); - objFormatInteger(&(dictP[CMAPSUPPLEMENT].value),-1); - objFormatName(&(dictP[CMAPNAME].key),8,"CMapName"); - objFormatString(&(dictP[CMAPNAME].value),0,NULL); - objFormatName(&(dictP[CMAPVERSION].key),11,"CMapVersion"); - objFormatInteger(&(dictP[CMAPVERSION].value),-1); - objFormatName(&(dictP[CMAPTYPE].key),8,"CMapType"); - objFormatInteger(&(dictP[CMAPTYPE].value),-1); - objFormatName(&(dictP[CMAPWMODE].key),5,"WMode"); - objFormatInteger(&(dictP[CMAPWMODE].value),-1); - objFormatName(&(dictP[CMAPCIDCOUNT].key),8,"CIDCount"); - objFormatInteger(&(dictP[CMAPCIDCOUNT].value),-1); - return(SCAN_OK); -} -#endif - -/***================================================================***/ -/* - * BuildFontInfo Dictionary - */ -/***================================================================***/ -static int -BuildFontInfo(psfont *fontP) -{ - psdict *dictP; - - /* allocate the private dictionary */ - dictP = (psdict *)vm_alloc(20*sizeof(psdict)); - if (!(dictP)) return(SCAN_OUT_OF_MEMORY); - - fontP->fontInfoP = dictP; - fontP->fontInfoP[0].key.len = 17; /* number of actual entries */ - objFormatName(&(dictP[FONTNAME].key),8,"FontName"); - objFormatName(&(dictP[FONTNAME].value),0,NULL); - objFormatName(&(dictP[PAINTTYPE].key),9,"PaintType"); - objFormatInteger(&(dictP[PAINTTYPE].value),0); - objFormatName(&(dictP[FONTTYPENUM].key),8,"FontType"); - objFormatInteger(&(dictP[FONTTYPENUM].value),0); - objFormatName(&(dictP[FONTMATRIX].key),10,"FontMatrix"); - objFormatArray(&(dictP[FONTMATRIX].value),0,NULL); - objFormatName(&(dictP[FONTBBOX].key),8,"FontBBox"); - objFormatArray(&(dictP[FONTBBOX].value),0,NULL); - objFormatName(&(dictP[ENCODING].key),8,"Encoding"); - objFormatEncoding(&(dictP[ENCODING].value),0,NULL); - objFormatName(&(dictP[UNIQUEID].key),8,"UniqueID"); - objFormatInteger(&(dictP[UNIQUEID].value),0); - objFormatName(&(dictP[STROKEWIDTH].key),11,"StrokeWidth"); - objFormatReal(&(dictP[STROKEWIDTH].value),0.0); - objFormatName(&(dictP[VERSION].key),7,"version"); - objFormatString(&(dictP[VERSION].value),0,NULL); - objFormatName(&(dictP[NOTICE].key),6,"Notice"); - objFormatString(&(dictP[NOTICE].value),0,NULL); - objFormatName(&(dictP[FULLNAME].key),8,"FullName"); - objFormatString(&(dictP[FULLNAME].value),0,NULL); - objFormatName(&(dictP[FAMILYNAME].key),10,"FamilyName"); - objFormatString(&(dictP[FAMILYNAME].value),0,NULL); - objFormatName(&(dictP[WEIGHT].key),6,"Weight"); - objFormatString(&(dictP[WEIGHT].value),0,NULL); - objFormatName(&(dictP[ITALICANGLE].key),11,"ItalicAngle"); - objFormatReal(&(dictP[ITALICANGLE].value),0.0); - objFormatName(&(dictP[ISFIXEDPITCH].key),12,"isFixedPitch"); - objFormatBoolean(&(dictP[ISFIXEDPITCH].value),FALSE); - objFormatName(&(dictP[UNDERLINEPOSITION].key),17,"UnderlinePosition"); - objFormatReal(&(dictP[UNDERLINEPOSITION].value),0.0); - objFormatName(&(dictP[UNDERLINETHICKNESS].key),18,"UnderlineThickness"); - objFormatReal(&(dictP[UNDERLINETHICKNESS].value),0.0); - return(SCAN_OK); -} -#if XFONT_CID -/***================================================================***/ -/* - * BuildCIDType1Private Dictionary - */ -/***================================================================***/ -static int -BuildCIDType1Private(psfont *fontP) -{ - psdict *Private; - - /* allocate the private dictionary */ - Private = (psdict *)vm_alloc(21*sizeof(psdict)); - - if (!(Private)) return(SCAN_OUT_OF_MEMORY); - - fontP->Private = Private; - fontP->Private[0].key.len = 20; /* number of actual entries */ - - objFormatName(&(Private[CIDT1MINFEATURE].key),10,"MinFeature"); - objFormatArray(&(Private[CIDT1MINFEATURE].value),0,NULL); - objFormatName(&(Private[CIDT1LENIV].key),5,"lenIV"); - objFormatInteger(&(Private[CIDT1LENIV].value),DEFAULTLENIV); - objFormatName(&(Private[CIDT1LANGGROUP].key),13,"LanguageGroup"); - objFormatInteger(&(Private[CIDT1LANGGROUP].value),DEFAULTLANGUAGEGROUP); - objFormatName(&(Private[CIDT1BLUEVALUES].key),10,"BlueValues"); - objFormatArray(&(Private[CIDT1BLUEVALUES].value),0,NULL); - objFormatName(&(Private[CIDT1OTHERBLUES].key),10,"OtherBlues"); - objFormatArray(&(Private[CIDT1OTHERBLUES].value),0,NULL); - objFormatName(&(Private[CIDT1BLUESCALE].key),9,"BlueScale"); - objFormatReal(&(Private[CIDT1BLUESCALE].value),DEFAULTBLUESCALE); - objFormatName(&(Private[CIDT1BLUEFUZZ].key),8,"BlueFuzz"); - objFormatInteger(&(Private[CIDT1BLUEFUZZ].value),DEFAULTBLUEFUZZ); - objFormatName(&(Private[CIDT1BLUESHIFT].key),9,"BlueShift"); - objFormatInteger(&(Private[CIDT1BLUESHIFT].value),DEFAULTBLUESHIFT); - objFormatName(&(Private[CIDT1FAMBLUES].key),11,"FamilyBlues"); - objFormatArray(&(Private[CIDT1FAMBLUES].value),0,NULL); - objFormatName(&(Private[CIDT1FAMOTHERBLUES].key),16,"FamilyOtherBlues"); - objFormatArray(&(Private[CIDT1FAMOTHERBLUES].value),0,NULL); - objFormatName(&(Private[CIDT1STDHW].key),5,"StdHW"); - objFormatArray(&(Private[CIDT1STDHW].value),0,NULL); - objFormatName(&(Private[CIDT1STDVW].key),5,"StdVW"); - objFormatArray(&(Private[CIDT1STDVW].value),0,NULL); - objFormatName(&(Private[CIDT1STEMSNAPH].key),9,"StemSnapH"); - objFormatArray(&(Private[CIDT1STEMSNAPH].value),0,NULL); - objFormatName(&(Private[CIDT1STEMSNAPV].key),9,"StemSnapV"); - objFormatArray(&(Private[CIDT1STEMSNAPV].value),0,NULL); - /* skip password */ - objFormatName(&(Private[CIDT1SUBMAPOFF].key),13,"SubrMapOffset"); - objFormatInteger(&(Private[CIDT1SUBMAPOFF].value),0); - objFormatName(&(Private[CIDT1SDBYTES].key),7,"SDBytes"); - objFormatInteger(&(Private[CIDT1SDBYTES].value),0); - objFormatName(&(Private[CIDT1SUBRCNT].key),9,"SubrCount"); - objFormatInteger(&(Private[CIDT1SUBRCNT].value),0); - objFormatName(&(Private[CIDT1FORCEBOLD].key),9,"ForceBold"); - objFormatBoolean(&(Private[CIDT1FORCEBOLD].value),DEFAULTFORCEBOLD); - objFormatName(&(Private[CIDT1RNDSTEMUP].key),9,"RndStemUp"); - objFormatBoolean(&(Private[CIDT1RNDSTEMUP].value),DEFAULTRNDSTEMUP); - objFormatName(&(Private[CIDT1EXPFACTOR].key),15,"ExpansionFactor"); - objFormatReal(&(Private[CIDT1EXPFACTOR].value), - DEFAULTEXPANSIONFACTOR); - return(SCAN_OK); -} -#endif -/***================================================================***/ -/* - * BuildPrivate Dictionary - */ -/***================================================================***/ -static int -BuildPrivate(psfont *fontP) -{ - psdict *Private; - - /* allocate the private dictionary */ - Private = (psdict *)vm_alloc(20*sizeof(psdict)); - - if (!(Private)) return(SCAN_OUT_OF_MEMORY); - - fontP->Private = Private; - fontP->Private[0].key.len = 16; /* number of actual entries */ - - objFormatName(&(Private[BLUEVALUES].key),10,"BlueValues"); - objFormatArray(&(Private[BLUEVALUES].value),0,NULL); - objFormatName(&(Private[OTHERBLUES].key),10,"OtherBlues"); - objFormatArray(&(Private[OTHERBLUES].value),0,NULL); - objFormatName(&(Private[FAMILYBLUES].key),11,"FamilyBlues"); - objFormatArray(&(Private[FAMILYBLUES].value),0,NULL); - objFormatName(&(Private[FAMILYOTHERBLUES].key),16,"FamilyOtherBlues"); - objFormatArray(&(Private[FAMILYOTHERBLUES].value),0,NULL); - objFormatName(&(Private[BLUESCALE].key),9,"BlueScale"); - objFormatReal(&(Private[BLUESCALE].value),DEFAULTBLUESCALE); - objFormatName(&(Private[BLUESHIFT].key),9,"BlueShift"); - objFormatInteger(&(Private[BLUESHIFT].value),DEFAULTBLUESHIFT); - objFormatName(&(Private[BLUEFUZZ].key),8,"BlueFuzz"); - objFormatInteger(&(Private[BLUEFUZZ].value),DEFAULTBLUEFUZZ); - objFormatName(&(Private[STDHW].key),5,"StdHW"); - objFormatArray(&(Private[STDHW].value),0,NULL); - objFormatName(&(Private[STDVW].key),5,"StdVW"); - objFormatArray(&(Private[STDVW].value),0,NULL); - objFormatName(&(Private[STEMSNAPH].key),9,"StemSnapH"); - objFormatArray(&(Private[STEMSNAPH].value),0,NULL); - objFormatName(&(Private[STEMSNAPV].key),9,"StemSnapV"); - objFormatArray(&(Private[STEMSNAPV].value),0,NULL); - objFormatName(&(Private[FORCEBOLD].key),9,"ForceBold"); - objFormatBoolean(&(Private[FORCEBOLD].value),DEFAULTFORCEBOLD); - objFormatName(&(Private[LANGUAGEGROUP].key),13,"LanguageGroup"); - objFormatInteger(&(Private[LANGUAGEGROUP].value),DEFAULTLANGUAGEGROUP); - objFormatName(&(Private[LENIV].key),5,"lenIV"); - objFormatInteger(&(Private[LENIV].value),DEFAULTLENIV); - objFormatName(&(Private[RNDSTEMUP].key),9,"RndStemUp"); - objFormatBoolean(&(Private[RNDSTEMUP].value),DEFAULTRNDSTEMUP); - objFormatName(&(Private[EXPANSIONFACTOR].key),9,"ExpansionFactor"); - objFormatReal(&(Private[EXPANSIONFACTOR].value), - DEFAULTEXPANSIONFACTOR); - return(SCAN_OK); -} -/***================================================================***/ -/**********************************************************************/ -/* GetType1Blues(fontP) */ -/* */ -/* Routine to support font-level hints. */ -/* */ -/* Gets all the Blues information from the Private dictionary */ -/* for the font. */ -/* */ -/* */ -/**********************************************************************/ -static int -GetType1Blues(psfont *fontP) -{ - psdict *PrivateDictP; /* the Private dict relating to hints */ - struct blues_struct *blues; /* ptr for the blues struct we will allocate */ - int i; - psobj *HintEntryP; - - - - /* get the Private dictionary pointer */ - PrivateDictP = fontP->Private; - - /* allocate the memory for the blues structure */ - blues = (struct blues_struct *) vm_alloc(sizeof(struct blues_struct)); - - if (!blues) return(SCAN_OUT_OF_MEMORY); - - /* Make fontP's blues ptr point to this newly allocated structure. */ - fontP->BluesP = blues; - - /* fill in the BlueValues array */ - HintEntryP = &(PrivateDictP[BLUEVALUES].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numBlueValues = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMBLUEVALUES) { - blues->numBlueValues = NUMBLUEVALUES; - } else - blues->numBlueValues = HintEntryP->len; - for (i = 0; i<= blues->numBlueValues-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->BlueValues[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->BlueValues[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->BlueValues[i] = 0; - } - } - - /* fill in the OtherBlues array */ - HintEntryP = &(PrivateDictP[OTHERBLUES].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numOtherBlues = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMOTHERBLUES) { - blues->numOtherBlues = NUMOTHERBLUES; - } else - blues->numOtherBlues = HintEntryP->len; - for (i = 0; i<= blues->numOtherBlues-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->OtherBlues[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->OtherBlues[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->OtherBlues[i] = 0; - } - } - - /* fill in the FamilyBlues array */ - HintEntryP = &(PrivateDictP[FAMILYBLUES].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numFamilyBlues = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMFAMILYBLUES) { - blues->numFamilyBlues = NUMFAMILYBLUES; - } else - blues->numFamilyBlues = HintEntryP->len; - for (i = 0; i<= blues->numFamilyBlues-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->FamilyBlues[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->FamilyBlues[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->FamilyBlues[i] = 0; - } - } - - /* fill in the FamilyOtherBlues array */ - HintEntryP = &(PrivateDictP[FAMILYOTHERBLUES].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numFamilyOtherBlues = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMFAMILYOTHERBLUES) { - blues->numFamilyOtherBlues = NUMFAMILYOTHERBLUES; - } else - blues->numFamilyOtherBlues = HintEntryP->len; - for (i = 0; i<= blues->numFamilyOtherBlues-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->FamilyOtherBlues[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->FamilyOtherBlues[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->FamilyOtherBlues[i] = 0; - } - } - - /* fill in the StemSnapH array */ - HintEntryP = &(PrivateDictP[STEMSNAPH].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numStemSnapH = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMSTEMSNAPH) { - blues->numStemSnapH = NUMSTEMSNAPH; - } else - blues->numStemSnapH = HintEntryP->len; - for (i = 0; i<= blues->numStemSnapH-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->StemSnapH[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->StemSnapH[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->StemSnapH[i] = 0; - } - } - - /* fill in the StemSnapV array */ - HintEntryP = &(PrivateDictP[STEMSNAPV].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - blues->numStemSnapV = 0; - else { - /* get the number of values in the array */ - if (HintEntryP->len > NUMSTEMSNAPV) { - blues->numStemSnapV = NUMSTEMSNAPV; - } else - blues->numStemSnapV = HintEntryP->len; - for (i = 0; i<= blues->numStemSnapV-1; ++i) { - if (objPIsInteger(&HintEntryP->data.arrayP[i])) - blues->StemSnapV[i] = - HintEntryP->data.arrayP[i].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[i])) - blues->StemSnapV[i] = - HintEntryP->data.arrayP[i].data.real; - else - blues->StemSnapV[i] = 0; - } - } - - /* fill in the StdVW array */ - HintEntryP = &(PrivateDictP[STDVW].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - /* a value of zero signifies no entry */ - blues->StdVW = 0; - else { - if (HintEntryP->len > NUMSTDVW) { - } - if (objPIsInteger(&HintEntryP->data.arrayP[0])) - blues->StdVW = HintEntryP->data.arrayP[0].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[0])) - blues->StdVW = HintEntryP->data.arrayP[0].data.real; - else - blues->StdVW = 0; - } - - /* fill in the StdHW array */ - HintEntryP = &(PrivateDictP[STDHW].value); - /* check to see if the entry exists and if it's an array */ - if ( !objPIsArray(HintEntryP) || (HintEntryP->len == 0 )) - /* a value of zero signifies no entry */ - blues->StdHW = 0; - else { - if (HintEntryP->len > NUMSTDHW) { - } - if (objPIsInteger(&HintEntryP->data.arrayP[0])) - blues->StdHW = HintEntryP->data.arrayP[0].data.integer; - else if (objPIsReal(&HintEntryP->data.arrayP[0])) - blues->StdHW = HintEntryP->data.arrayP[0].data.real; - else - blues->StdHW = 0; - } - - - /* get the ptr to the BlueScale entry */ - HintEntryP = &(PrivateDictP[BLUESCALE].value); - /* put the BlueScale in the blues structure */ - if (objPIsInteger(HintEntryP)) /* Must be integer! */ - blues->BlueScale = HintEntryP->data.integer; - else if (objPIsReal(HintEntryP)) /* Error? */ - blues->BlueScale = HintEntryP->data.real; - else - blues->BlueScale = DEFAULTBLUESCALE; - - /* get the ptr to the BlueShift entry */ - HintEntryP = &(PrivateDictP[BLUESHIFT].value); - if (objPIsInteger(HintEntryP)) /* Must be integer! */ - blues->BlueShift = HintEntryP->data.integer; - else if (objPIsReal(HintEntryP)) /* Error? */ - blues->BlueShift = HintEntryP->data.real; - else - blues->BlueShift = DEFAULTBLUESHIFT; - - /* get the ptr to the BlueFuzz entry */ - HintEntryP = &(PrivateDictP[BLUEFUZZ].value); - if (objPIsInteger(HintEntryP)) /* Must be integer! */ - blues->BlueFuzz = HintEntryP->data.integer; - else if (objPIsReal(HintEntryP)) /* Error? */ - blues->BlueFuzz = HintEntryP->data.real; - else - blues->BlueFuzz = DEFAULTBLUEFUZZ; - - /* get the ptr to the ForceBold entry */ - HintEntryP = &(PrivateDictP[FORCEBOLD].value); - if (objPIsBoolean(HintEntryP)) /* Must be integer! */ - blues->ForceBold = HintEntryP->data.boolean; - else - blues->ForceBold = DEFAULTFORCEBOLD; - - /* get the ptr to the LanguageGroup entry */ - HintEntryP = &(PrivateDictP[LANGUAGEGROUP].value); - if (objPIsInteger(HintEntryP)) /* Must be integer! */ - blues->LanguageGroup = HintEntryP->data.integer; - else - blues->LanguageGroup = DEFAULTLANGUAGEGROUP; - - /* get the ptr to the RndStemUp entry */ - HintEntryP = &(PrivateDictP[RNDSTEMUP].value); - if (objPIsBoolean(HintEntryP)) /* Must be integer! */ - blues->RndStemUp = HintEntryP->data.boolean; - else - blues->RndStemUp = DEFAULTRNDSTEMUP; - - /* get the ptr to the lenIV entry */ - HintEntryP = &(PrivateDictP[LENIV].value); - if (objPIsInteger(HintEntryP)) /* Must be integer! */ - blues->lenIV = HintEntryP->data.integer; - else - blues->lenIV = DEFAULTLENIV; - - /* get the ptr to the ExpansionFactor entry */ - HintEntryP = &(PrivateDictP[EXPANSIONFACTOR].value); - if (objPIsInteger(HintEntryP)) - blues->ExpansionFactor = HintEntryP->data.integer; - else if (objPIsReal(HintEntryP)) - blues->ExpansionFactor = HintEntryP->data.real; - else - blues->ExpansionFactor = DEFAULTEXPANSIONFACTOR; - return(SCAN_OK); -} -/**********************************************************************/ -/* GetType1CharString(fontP,code) */ -/* */ -/* Look up code in the standard encoding vector and return */ -/* the charstring associated with the character name. */ -/* */ -/* fontP is the psfont structure. */ -/* */ -/* Returns a psobj (string) */ -/**********************************************************************/ -psobj * -GetType1CharString(psfont *fontP, unsigned char code) -{ - int N; /* the 'Nth' entry in the CharStrings */ - psobj *charnameP; /* points to psobj that is name of character*/ - - psdict *CharStringsDictP; /* dictionary with char strings */ - psobj *theStringP; /* the definition for the code */ - - - - if (StdEncArrayP == NULL) { - return(NULL); - } - /* use the code to index into the standard encoding vector */ - charnameP = &(StdEncArrayP[code]); - - /* test if the encoding array points to a name */ - if (!(objPIsName(charnameP)) ) { - return(NULL); - } - - /* Now that we have the character name out of the standardencoding */ - /* get the character definition out of the current font */ - CharStringsDictP = fontP->CharStringsP; - - /* search the chars string for this charname as key */ - N = SearchDictName(CharStringsDictP,charnameP); - if (N<=0) { - return(NULL); - } - /* OK, the nth item is the psobj that is the string for this char */ - theStringP = &(CharStringsDictP[N].value); - - return(theStringP); -} - -/***================================================================***/ -/* - * FindDictValue - */ -/***================================================================***/ - -static int -FindDictValue(psdict *dictP) -{ - psobj LitName; - int N; - int V; - - /* we have just scanned a token and it is a literal name */ - /* need to check if that name is in Private dictionary */ - objFormatName(&LitName,tokenLength,tokenStartP); - /* is it in the dictP */ - N = SearchDictName(dictP,&LitName); - /* if found */ - if ( N > 0 ) { - /* what type */ - switch (dictP[N].value.type) { - case OBJ_ENCODING: - V = getEncoding(&(dictP[N].value)); - if ( V != SCAN_OK ) return(V); - break; - case OBJ_ARRAY: -#if XFONT_CID - if (0 == strncmp(tokenStartP,"FDArray",7)) - V = getFDArray(&(dictP[N].value)); - else - V = getArray(&(dictP[N].value)); -#else - V = getArray(&(dictP[N].value)); -#endif - if ( V != SCAN_OK ) return(V); - break; - case OBJ_INTEGER: - /* next value in integer */ - dictP[N].value.data.integer = getInt(); - if (rc) return(rc); /* if next token was not an Int */ - break; - case OBJ_REAL: - /* next value must be real or int, store as a real */ - scan_token(inputP); - if (tokenType == TOKEN_REAL) { - dictP[N].value.data.real = tokenValue.real; - } - else - if (tokenType == TOKEN_INTEGER) { - dictP[N].value.data.real = tokenValue.integer; - } - else return(SCAN_ERROR); - break; - case OBJ_NAME: - V = getNextValue(TOKEN_LITERAL_NAME); - if ( V != SCAN_OK ) return(V); - if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); - objFormatName(&(dictP[N].value),tokenLength,tokenStartP); - break; - case OBJ_STRING: - V = getNextValue(TOKEN_STRING); - if ( V != SCAN_OK ) return(V); - if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); - objFormatString(&(dictP[N].value),tokenLength,tokenStartP); - break; - case OBJ_BOOLEAN: - scan_token(inputP); - if (tokenType != TOKEN_NAME) { - return(SCAN_ERROR); - } - if (0 == strncmp(tokenStartP,"true",4) ) { - dictP[N].value.data.boolean =TRUE; - } - else - if (0 == strncmp(tokenStartP,"false",5) ) { - dictP[N].value.data.boolean =FALSE; - } - else return(SCAN_ERROR); - break; - - default: - return(SCAN_ERROR); - } - } - /* Name is not in dictionary. That is ok. */ - return(SCAN_OK); - -} -/***================================================================***/ - -#if XFONT_CID -/* - * ------------------------------------------------------------------- - * Scan the next token and convert it into an object - * Result is placed on the Operand Stack as next object - * ------------------------------------------------------------------- - */ -int -scan_cidfont(cidfont *CIDFontP, cmapres *CMapP) -{ - char filename[CID_PATH_MAX]; - char cmapfile[CID_PATH_MAX]; - char buf[CID_BUFSIZE]; - char filetype[3]; - FILE *fileP; - FILE *fileP1; - char *nameP; - int namelen; - int i, j; - int cread, rangecnt; - unsigned int char_row, char_col; - - filetype[0] = 'r'; - filetype[1] = 'b'; - filetype[2] = '\0'; - - /* copy the filename and remove leading or trailing blanks */ - /* point to name and search for leading blanks */ - nameP= CIDFontP->CIDFontFileName.data.nameP; - namelen = CIDFontP->CIDFontFileName.len; - while (nameP[0] == ' ') { - nameP++; - namelen--; - } - /* now remove any trailing blanks */ - while ((namelen>0) && ( nameP[namelen-1] == ' ')) { - namelen--; - } - strncpy(filename,nameP,namelen); - filename[namelen] = '\0'; - /* file name is now constructed */ - inputFile.data.fileP = NULL; - filterFile.data.fileP = NULL; - - /* check whether a CIDFont file */ - if ((fileP = fopen(filename,filetype))) { - cread = fread(buf, 1, CID_BUFSIZE, fileP); - fclose(fileP); - if (cread > 17) { - if (strncmp(buf, "%!", 2) || - strstr(buf, "Resource-CIDFont") == NULL) - return(SCAN_FILE_OPEN_ERROR); - } else - return(SCAN_FILE_OPEN_ERROR); - } else - return(SCAN_FILE_OPEN_ERROR); - - /* copy the CMap file name and remove leading or trailing blanks */ - /* point to name and search for leading blanks */ - nameP = CMapP->CMapFileName.data.nameP; - namelen = CMapP->CMapFileName.len; - while (nameP[0] == ' ') { - nameP++; - namelen--; - } - /* now remove any trailing blanks */ - while ((namelen>0) && ( nameP[namelen-1] == ' ')) { - namelen--; - } - strncpy(cmapfile,nameP,namelen); - cmapfile[namelen] = '\0'; - /* CMap file name is now constructed */ - inputFile1.data.fileP = NULL; - - /* check whether a CMap file */ - if ((fileP1 = fopen(cmapfile,filetype))) { - cread = fread(buf, 1, CID_BUFSIZE, fileP1); - fclose(fileP1); - if (cread > 17) { - if (strncmp(buf, "%!", 2) || - strstr(buf, "Resource-CMap") == NULL) - return(SCAN_FILE_OPEN_ERROR); - } else - return(SCAN_FILE_OPEN_ERROR); - } else - return(SCAN_FILE_OPEN_ERROR); - - /* read the specified CMap file */ - inputP = &inputFile1; - - if (!(fileP1 = fopen(cmapfile,filetype))) - return(SCAN_FILE_OPEN_ERROR); - - objFormatFile(inputP,fileP1); - - if ((rc = BuildCMapInfo(CMapP)) != 0) - return(rc); - - /* Assume everything will be OK */ - rc = 0; - rangecnt = 0; - - do { - /* Scan the next token */ - scan_token(inputP); - if (tokenType == TOKEN_INTEGER) - rangecnt = tokenValue.integer; - - if (rangecnt < 0 || rangecnt > INT_MAX / sizeof(spacerangecode)) { - rc = SCAN_ERROR; - break; - } - /* ==> tokenLength, tokenTooLong, tokenType, and */ - /* tokenValue are now set */ - - switch (tokenType) { - case TOKEN_EOF: - case TOKEN_NONE: - case TOKEN_INVALID: - /* in this case we are done */ - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - rc = SCAN_ERROR; - break; - case TOKEN_LITERAL_NAME: - /* Look up the name */ - tokenStartP[tokenLength] = '\0'; - - rc = FindDictValue(CMapP->CMapInfoP); - /* we are not going to report errors except out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - case TOKEN_NAME: - if (0 == strncmp(tokenStartP,"begincodespacerange",19)) { - CIDFontP->spacerangecnt++; - spacerangeP = (spacerange *)vm_alloc(sizeof(spacerange)); - if (!spacerangeP) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - spacerangeP->next = NULL; - spacerangeP->rangecnt = rangecnt; - spacerangeP->spacecode = - (spacerangecode *)vm_alloc(rangecnt*sizeof(spacerangecode)); - if (!spacerangeP->spacecode) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - for (i = 0; i < rangecnt; i++) { - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - spacerangeP->spacecode[i].srcCodeLo = 0; - for (j = 0; j < tokenLength; j++) - spacerangeP->spacecode[i].srcCodeLo += - (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); - - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - spacerangeP->spacecode[i].srcCodeHi = 0; - for (j = 0; j < tokenLength; j++) - spacerangeP->spacecode[i].srcCodeHi += - (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); - } - - if (CIDFontP->spacerangeP) { - if (CIDFontP->spacerangeP->next == NULL) - CIDFontP->spacerangeP->next = spacerangeP; - else { - spacerangeP->next = CIDFontP->spacerangeP->next; - CIDFontP->spacerangeP->next = spacerangeP; - } - } else - CIDFontP->spacerangeP = spacerangeP; - - /* read "endcodespacerange" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && - (strncmp(tokenStartP,"endcodespacerange",17) != 0))) { - rc = SCAN_ERROR; - break; - } - } - if (0 == strncmp(tokenStartP,"begincidrange",13)) { - CIDFontP->cidrangecnt++; - cidrangeP = (cidrange *)vm_alloc(sizeof(cidrange)); - if (!cidrangeP) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - cidrangeP->next = NULL; - cidrangeP->rangecnt = rangecnt; - cidrangeP->range = - (cidrangecode *)vm_alloc(rangecnt*sizeof(cidrangecode)); - if (!cidrangeP->range) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - for (i = 0; i < rangecnt; i++) { - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - cidrangeP->range[i].srcCodeLo = 0; - for (j = 0; j < tokenLength; j++) - cidrangeP->range[i].srcCodeLo += - (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); - char_row = (cidrangeP->range[i].srcCodeLo >> 8) & 0xff; - char_col = cidrangeP->range[i].srcCodeLo & 0xff; - if (char_row < CMapP->firstRow) - CMapP->firstRow = char_row; - if (char_row > CMapP->lastRow) - CMapP->lastRow = char_row; - if (char_col < CMapP->firstCol) - CMapP->firstCol = char_col; - if (char_col > CMapP->lastCol) - CMapP->lastCol = char_col; - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - cidrangeP->range[i].srcCodeHi = 0; - for (j = 0; j < tokenLength; j++) - cidrangeP->range[i].srcCodeHi += - (unsigned char)tokenStartP[j] << (8 * (tokenLength - 1 - j)); - char_row = (cidrangeP->range[i].srcCodeHi >> 8) & 0xff; - char_col = cidrangeP->range[i].srcCodeHi & 0xff; - if (char_row < CMapP->firstRow) - CMapP->firstRow = char_row; - if (char_row > CMapP->lastRow) - CMapP->lastRow = char_row; - if (char_col < CMapP->firstCol) - CMapP->firstCol = char_col; - if (char_col > CMapP->lastCol) - CMapP->lastCol = char_col; - scan_token(inputP); - if (tokenType != TOKEN_INTEGER) { - rc = SCAN_ERROR; - break; - } - cidrangeP->range[i].dstCIDLo = tokenValue.integer; - } - - if (CIDFontP->cidrangeP) { - if (CIDFontP->cidrangeP->next == NULL) - CIDFontP->cidrangeP->next = cidrangeP; - else { - cidrangeP->next = CIDFontP->cidrangeP->next; - CIDFontP->cidrangeP->next = cidrangeP; - } - } else - CIDFontP->cidrangeP = cidrangeP; - - /* read "endcidrange" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && - (strncmp(tokenStartP,"endcidrange",11) != 0))) { - rc = SCAN_ERROR; - break; - } - } - - if (0 == strncmp(tokenStartP,"beginnotdefrange",16)) { - CIDFontP->notdefrangecnt++; - notdefrangeP = (cidrange *)vm_alloc(sizeof(cidrange)); - if (!notdefrangeP) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - notdefrangeP->next = 0; - notdefrangeP->rangecnt = rangecnt; - notdefrangeP->range = - (cidrangecode *)vm_alloc(rangecnt*sizeof(cidrangecode)); - if (!notdefrangeP->range) { - rc = SCAN_OUT_OF_MEMORY; - break; - } - for (i = 0; i < rangecnt; i++) { - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - notdefrangeP->range[i].srcCodeLo = 0; - for (j = 0; j < tokenLength; j++) - notdefrangeP->range[i].srcCodeLo = (int)(tokenStartP[j] << - (8 * (tokenLength - 1 - j))); - scan_token(inputP); - if (tokenType != TOKEN_HEX_STRING) { - rc = SCAN_ERROR; - break; - } - notdefrangeP->range[i].srcCodeHi = 0; - for (j = 0; j < tokenLength; j++) - notdefrangeP->range[i].srcCodeHi = (int)(tokenStartP[j] << - (8 * (tokenLength - 1 - j))); - scan_token(inputP); - if (tokenType != TOKEN_INTEGER) { - rc = SCAN_ERROR; - break; - } - notdefrangeP->range[i].dstCIDLo = tokenValue.integer; - } - if (CIDFontP->notdefrangeP) { - if (CIDFontP->notdefrangeP->next == NULL) - CIDFontP->notdefrangeP->next = notdefrangeP; - else { - notdefrangeP->next = CIDFontP->notdefrangeP->next; - CIDFontP->notdefrangeP->next = notdefrangeP; - } - } else - CIDFontP->notdefrangeP = notdefrangeP; - - /* read "endnotdefrange" */ - scan_token(inputP); - if (tokenType != TOKEN_NAME || (tokenType == TOKEN_NAME && - (strncmp(tokenStartP,"endnotdefrange",14) != 0))) { - rc = SCAN_ERROR; - break; - } - } - - if (0 == strncmp(tokenStartP,"endcmap",7)) { - if (CMapP->CMapInfoP[CMAPREGISTRY].value.data.valueP == NULL || - CMapP->CMapInfoP[CMAPORDERING].value.data.valueP == NULL || - CMapP->CMapInfoP[CMAPSUPPLEMENT].value.data.integer == -1) { - rc = SCAN_ERROR; - break; - } else { - rc = SCAN_FILE_EOF; - break; - } - } - break; - } - } - while (rc == 0); - fclose(inputP->data.fileP); - if (tokenTooLong) - rc = SCAN_OUT_OF_MEMORY; - if (rc == SCAN_OUT_OF_MEMORY) return(rc); - - /* open the specified CIDFont file */ - if (!(fileP = fopen(filename,filetype))) - return(SCAN_FILE_OPEN_ERROR); - - inputP = &inputFile; - objFormatFile(inputP,fileP); - CIDWantFontInfo = TRUE; - TwoSubrs = FALSE; - rc = BuildCIDFontInfo(CIDFontP); - if (rc != 0) return(rc); - - /* Assume everything will be OK */ - rc = 0; - - /* Loop until complete font is read */ - do { - /* Scan the next token */ - scan_token(inputP); - - /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ - /* now set */ - - switch (tokenType) { - case TOKEN_EOF: - case TOKEN_NONE: - case TOKEN_INVALID: - /* in this case we are done */ - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - rc = SCAN_ERROR; - break; - case TOKEN_LITERAL_NAME: - /* Look up the name */ - tokenStartP[tokenLength] = '\0'; - - if (CIDWantFontInfo) { - rc = FindDictValue(CIDFontP->CIDfontInfoP); - /* we are not going to report errors except out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - } - break; - case TOKEN_STRING: - tokenStartP[tokenLength] = '\0'; - if (0 == strncmp(tokenStartP,"Binary",6)) { - CIDFontP->binarydata = 1; - scan_token(inputP); - if (tokenType == TOKEN_INTEGER) - CIDFontP->bytecnt = tokenValue.integer; - else { - rc = SCAN_ERROR; - break; - } - } else if (0 == strncmp(tokenStartP,"Hex",3)) { - /* not yet supported */ - rc = SCAN_ERROR; - break; -#if 0 - /* uncomment when the hex format is supported */ - CIDFontP->binarydata = 0; - scan_token(inputP); - if (tokenType == TOKEN_INTEGER) - CIDFontP->bytecnt = tokenValue.integer; - else { - rc = SCAN_ERROR; - break; - } -#endif - } - break; - case TOKEN_NAME: - /* end of PostScript and beginning of data */ - if (0 == strncmp(tokenStartP,"StartData",9)) { - /* every CIDFont must have an FDArray */ - /* check whether other required dictionary entries were found */ - if (CIDFontP->CIDfontInfoP[CIDFDARRAY].value.data.arrayP == NULL || - CIDFontP->CIDfontInfoP[CIDFONTNAME].value.data.nameP == NULL || - CIDFontP->CIDfontInfoP[CIDFONTTYPE].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDVERSION].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDREGISTRY].value.data.valueP == NULL || - CIDFontP->CIDfontInfoP[CIDORDERING].value.data.valueP == NULL || - CIDFontP->CIDfontInfoP[CIDSUPPLEMENT].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP == NULL || - CIDFontP->CIDfontInfoP[CIDMAPOFFSET].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDFDBYTES].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDGDBYTES].value.data.integer == -1 || - CIDFontP->CIDfontInfoP[CIDCOUNT].value.data.integer == -1) { - rc = SCAN_ERROR; - break; - } else { - /* do Registry and Ordering entries match? */ - if (strcmp(CIDFontP->CIDfontInfoP[CIDREGISTRY].value.data.valueP, - CMapP->CMapInfoP[CMAPREGISTRY].value.data.valueP) != 0 || - strcmp(CIDFontP->CIDfontInfoP[CIDORDERING].value.data.valueP, - CMapP->CMapInfoP[CMAPORDERING].value.data.valueP) != 0) { - rc = SCAN_ERROR; - break; - } else { - fclose(inputP->data.fileP); - return(SCAN_OK); - } - } - } - break; - } - - } - while (rc ==0); - fclose(inputP->data.fileP); - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - return(rc); -} - -/* - * ------------------------------------------------------------------- - * Scan the next token and convert it into an object - * Result is placed on the Operand Stack as next object - * ------------------------------------------------------------------- - */ -int -scan_cidtype1font(psfont *FontP) -{ - int i; - int begincnt = 0; /* counter for the number of unpaired begin operators */ - int currentfilefound = 0; - - WantFontInfo = TRUE; - InPrivateDict = FALSE; - TwoSubrs = FALSE; - rc = BuildFontInfo(FontP); - if (rc != 0) return(rc); - - /* Assume everything will be OK */ - rc = 0; - filterFile.data.fileP = NULL; - - /* Loop until complete font is read */ - do { - /* Scan the next token */ - scan_token(inputP); - - /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ - /* now set */ - - switch (tokenType) { - case TOKEN_EOF: - case TOKEN_NONE: - case TOKEN_INVALID: - /* in this case we are done */ - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - rc = SCAN_ERROR; - break; - case TOKEN_LITERAL_NAME: - /* Look up the name */ - tokenStartP[tokenLength] = '\0'; - if (InPrivateDict ) { - rc = FindDictValue(FontP->Private); - /* we are not going to report errors */ - /* Sometimes the font file may test a value such as */ - /* testing to see if the font is alreadly loaded with */ - /* same UniqueID. We would faile on /UniqueID get */ - /* because we are expecting a int to follow UniqueID*/ - /* If the correct object type does not follow a Name*/ - /* then we will skip over it without reporting error except */ - /* out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - } /* end of reading Private dictionary */ - else - if (0 == strncmp(tokenStartP,"Private",7) ) { - InPrivateDict = TRUE; - rc = BuildCIDType1Private(FontP); - break; - } - else - if (WantFontInfo) { - rc = FindDictValue(FontP->fontInfoP); - /* we are not going to report errors except out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - } - break; - case TOKEN_NAME: - if (0 == strncmp(tokenStartP,"currentfile",11)) { - currentfilefound = 1; - break; - } else if (0 == strncmp(tokenStartP,"eexec",5)) { - if (currentfilefound == 1) { - currentfilefound = 0; - filterFile.data.fileP = CIDeexec(inputP->data.fileP); - if (filterFile.data.fileP == NULL) { - fclose(inputFile.data.fileP); - return(SCAN_FILE_OPEN_ERROR); - } - inputP = &filterFile; - } else { - rc = SCAN_ERROR; - break; - } - } else if (0 == strncmp(tokenStartP,"begin",5)) { - begincnt++; - currentfilefound = 0; - } else if (0 == strncmp(tokenStartP,"end",3)) { - currentfilefound = 0; - begincnt--; - if (begincnt == 0) { - if (filterFile.data.fileP != NULL) { - scan_token(inputP); /* get 'currentfile' */ - scan_token(inputP); /* get 'closefile' */ - inputP = &inputFile; - resetDecrypt(); - inputP->data.fileP->b_cnt = - F_BUFSIZ - (inputP->data.fileP->b_ptr - - inputP->data.fileP->b_base); - if (inputP->data.fileP->b_cnt > 0) { - for (i = 0; i < inputP->data.fileP->b_cnt; i++) - if (*(inputP->data.fileP->b_ptr + i) == '%') - break; - if (i < inputP->data.fileP->b_cnt) { - inputP->data.fileP->b_cnt -= i; - inputP->data.fileP->b_ptr += i; - } else - inputP->data.fileP->b_cnt = 0; - } - } - rc = SCAN_OK; - return(rc); - } - if (begincnt < 0) { - rc = SCAN_ERROR; - break; - } - } - break; - } - - } - while (rc == 0); - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - return(rc); -} -#endif - -/* - * ------------------------------------------------------------------- - * Scan the next token and convert it into an object - * Result is placed on the Operand Stack as next object - * ------------------------------------------------------------------- - */ -int -scan_font(psfont *FontP) -{ - - - char filename[128]; - char filetype[3]; - FILE *fileP; - char *nameP; - int namelen; - int V; - int i; - boolean starthex80; - - starthex80 = FALSE; - filetype[0] = 'r'; - filetype[1] = 'b'; - filetype[2] = '\0'; - /* copy the filename and remove leading or trailing blanks */ - /* point to name and search for leading blanks */ - nameP= FontP->FontFileName.data.nameP; - namelen = FontP->FontFileName.len; - while (nameP[0] == ' ') { - nameP++; - namelen--; - } - /* now remove any trailing blanks */ - while ((namelen>0) && ( nameP[namelen-1] == ' ')) { - namelen--; - } - strncpy(filename,nameP,namelen); - filename[namelen] = '\0'; - /* file name is now constructed */ - inputFile.data.fileP = NULL; - filterFile.data.fileP = NULL; - - inputP = &inputFile; - if ((fileP = T1Open(filename,filetype))) { - /* get the first byte of file */ - V = _XT1getc(fileP); - /* if file starts with x'80' then skip next 5 bytes */ - if ( V == 0X80 ) { - for (i=0;i<5;i++) V = _XT1getc(fileP); - starthex80 = TRUE; - } - else T1Ungetc(V,fileP); - objFormatFile(inputP,fileP); - } - else { - return(SCAN_FILE_OPEN_ERROR); - }; - - WantFontInfo = TRUE; - InPrivateDict = FALSE; - TwoSubrs = FALSE; - rc = BuildFontInfo(FontP); - if (rc != 0) return(rc); - - /* Assume everything will be OK */ - rc = 0; - - /* Loop until complete font is read */ - do { - /* Scan the next token */ - scan_token(inputP); - - /* ==> tokenLength, tokenTooLong, tokenType, and tokenValue are */ - /* now set */ - - switch (tokenType) { - case TOKEN_EOF: - case TOKEN_NONE: - case TOKEN_INVALID: - /* in this case we are done */ - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - rc = SCAN_ERROR; - break; - case TOKEN_LITERAL_NAME: - /* Look up the name */ - tokenStartP[tokenLength] = '\0'; - if (InPrivateDict ) { - if (0== strncmp(tokenStartP,"Subrs",5) ) { - rc = BuildSubrs(FontP); - break; - } - if (0== strncmp(tokenStartP,"CharStrings",11) ) { - rc = BuildCharStrings(FontP); - if ( (rc == SCAN_OK) ||(rc == SCAN_END) ) { - T1Close(inputP->data.fileP); - /* Build the Blues Structure */ - rc = GetType1Blues(FontP); - /* whatever the return code, return it */ - /* all the work is done. This is the normal exit.*/ - return(rc); - } - break; - } - rc = FindDictValue(FontP->Private); - /* we are not going to report errors */ - /* Sometimes the font file may test a value such as */ - /* testing to see if the font is alreadly loaded with */ - /* same UniqueID. We would faile on /UniqueID get */ - /* because we are expecting a int to follow UniqueID*/ - /* If the correct object type does not follow a Name*/ - /* then we will skip over it without reporting error except */ - /* when out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - } /* end of reading Private dictionary */ - else - if (0== strncmp(tokenStartP,"Private",7) ) { - InPrivateDict = TRUE; - rc = BuildPrivate(FontP); - break; - } - else - if (WantFontInfo) { - rc = FindDictValue(FontP->fontInfoP); - /* we are not going to report errors except out of memory */ - if (rc != SCAN_OUT_OF_MEMORY) - rc = SCAN_OK; - break; - } - break; - case TOKEN_NAME: - if (0 == strncmp(tokenStartP,"eexec",5) ) { - /* if file started with x'80', check next 5 bytes */ - if (starthex80) { - V = _XT1getc(fileP); - if ( V == 0X80 ) { - for (i=0;i<5;i++) V = _XT1getc(fileP); - } - else T1Ungetc(V,fileP); - } - filterFile.data.fileP = T1eexec(inputP->data.fileP); - if (filterFile.data.fileP == NULL) { - T1Close(inputFile.data.fileP); - return(SCAN_FILE_OPEN_ERROR); - } - inputP = &filterFile; - - WantFontInfo = FALSE; - } - break; - } - - } - while (rc ==0); - T1Close(inputP->data.fileP); - if (tokenTooLong) return(SCAN_OUT_OF_MEMORY); - return(rc); -} - diff --git a/nx-X11/lib/font/Type1/spaces.c b/nx-X11/lib/font/Type1/spaces.c deleted file mode 100644 index 55cc96f67..000000000 --- a/nx-X11/lib/font/Type1/spaces.c +++ /dev/null @@ -1,998 +0,0 @@ -/* $Xorg: spaces.c,v 1.4 2000/08/17 19:46:32 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/spaces.c,v 3.10tsi Exp $ */ - /* SPACES CWEB V0021 ******** */ -/* -:h1 id=spaces.SPACES Module - Handles Coordinate Spaces - -This module is responsible for handling the TYPE1IMAGER "XYspace" object. - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - - -:h3.Include Files -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -#include "Xdefs.h" /* Bool declaration ??? */ -#include "Xmd.h" /* INT32 declaration ??? */ -#include "os.h" -#include "xf86_ansic.h" -#else -#include "X11/Xos.h" -#include -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "pictures.h" -#include "fonts.h" -#include "arith.h" -#include "trig.h" - -static void FindFfcn ( double cx, double cy, - convertFunc *fcnP ); -static void FindIfcn ( double cx, double cy, - fractpel *icxP, fractpel *icyP, - iconvertFunc *fcnP ); - -/* -:h3.Entry Points Provided to the TYPE1IMAGER User -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.Entry Points Provided to Other Modules -*/ - -/* -In addition, other modules call the SPACES module through function -vectors in the "XYspace" structure. The entry points accessed that -way are "FConvert()", "IConvert()", and "ForceFloat()". -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h3.Macros and Typedefs Provided to Other Modules - -:h4.Duplicating and Killing Spaces - -Destroying XYspaces is so simple we can do it with a -macro: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -On the other hand, duplicating XYspaces is slightly more difficult -because of the need to keep a unique ID in the space, see -:hdref refid=dupspace.. - -:h4.Fixed Point Pel Representation - -We represent pel positions with fixed point numbers. This does NOT -mean integer, but truly means fixed point, with a certain number -of binary digits (FRACTBITS) representing the fractional part of the -pel. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -/* -:h2.Data Structures for Coordinate Spaces and Points -*/ -/* -:h3 id=matrix.Matrices - -TYPE1IMAGER uses 2x2 transformation matrices. We'll use C notation for -such a matrix (M[2][2]), the first index being rows, the second columns. -*/ - -/* -:h3.The "doublematrix" Structure - -We frequently find it desirable to store both a matrix and its -inverse. We store these in a "doublematrix" structure. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.The "XYspace" Structure - -The XYspace structure represents the XYspace object. -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ -#define RESERVED 10 /* 'n' IDs are reserved for invalid & immortal spaces */ -/* -*/ -#define NEXTID ((SpaceID < RESERVED) ? (SpaceID = RESERVED) : ++SpaceID) - -static unsigned int SpaceID = 1; - -struct XYspace * -CopySpace(struct XYspace *S) -{ - S = (struct XYspace *)Allocate(sizeof(struct XYspace), S, 0); - S->ID = NEXTID; - return(S); -} -/* -:h3.The "fractpoint" Structure - -A fractional point is just a "fractpel" x and y: -*/ - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.Lazy Evaluation of Matrix Inverses - -Calculating the inverse of a matrix is somewhat involved, and we usually -do not need them. So, we flag whether or not the space has the inverse -already calculated: -*/ - -#define HASINVERSE(flag) ((flag)&0x80) - -/* -The following macro forces a space to have an inverse: -*/ - -#define CoerceInverse(S) if (!HASINVERSE((S)->flag)) { \ - MatrixInvert((S)->tofract.normal, (S)->tofract.inverse); (S)->flag |= HASINVERSE(ON); } -/* -:h3.IDENTITY Space - -IDENTITY space is (logically) the space corresponding to the identity -transformation matrix. However, since all our transformation matrices -have a common FRACTFLOAT scale factor to convert to 'fractpel's, that -is actually what we store in 'tofract' matrix of IDENTITY: -*/ - -static struct XYspace identity = { SPACETYPE, ISPERMANENT(ON) + ISIMMORTAL(ON) - + HASINVERSE(ON), 2, /* added 3-26-91 PNM */ - NULL, NULL, - NULL, NULL, NULL, NULL, - INVALIDID + 1, 0, - {{{FRACTFLOAT, 0.0}, {0.0, FRACTFLOAT}}, - {{1.0/FRACTFLOAT, 0.0}, {0.0, 1.0/FRACTFLOAT}}}, - {{0, 0}, {0, 0}}}; -struct XYspace *IDENTITY = &identity; - -/* -*/ -#define MAXCONTEXTS 16 - -static struct doublematrix contexts[MAXCONTEXTS]; - -#ifdef notdef - -static int nextcontext = 1; - -/*SHARED LINE(S) ORIGINATED HERE*/ - -/* -:h3.FindDeviceContext() - Find the Context Given a Device - -This routine, given a device, returns the index of the device's -transformation matrix in the context array. If it cannot find it, -it will allocate a new array entry and fill it out. -*/ - -static int -FindDeviceContext(pointer device) /* device token */ -{ - double M[2][2]; /* temporary matrix */ - float Xres,Yres; /* device resolution */ - int orient = -1; /* device orientation */ - int rc = -1; /* return code for QueryDeviceState */ - - if (rc != 0) /* we only bother with this check once */ - Abort("Context: QueryDeviceState didn't work"); - - M[0][0] = M[1][0] = M[0][1] = M[1][1] = 0.0; - - switch (orient) { - case 0: - M[0][0] = Xres; M[1][1] = -Yres; - break; - case 1: - M[1][0] = Yres; M[0][1] = Xres; - break; - case 2: - M[0][0] = -Xres; M[1][1] = Yres; - break; - case 3: - M[1][0] = -Yres; M[0][1] = -Xres; - break; - default: - Abort("QueryDeviceState returned invalid orientation"); - } - return(FindContext(M)); -} - -/* -:h3.FindContext() - Find the Context Given a Matrix - -This routine, given a matrix, returns the index of that matrix matrix in -the context array. If it cannot find it, it will allocate a new array -entry and fill it out. -*/ - -int -FindContext(double M[2][2]) /* array to search for */ -{ - register int i; /* loop variable for search */ - for (i=0; i < nextcontext; i++) - if (M[0][0] == contexts[i].normal[0][0] && M[1][0] == contexts[i].normal[1][0] - && M[0][1] == contexts[i].normal[0][1] && M[1][1] == contexts[i].normal[1][1]) - break; - - if (i >= nextcontext) { - if (i >= MAXCONTEXTS) - Abort("Context: out of them"); - LONGCOPY(contexts[i].normal, M, sizeof(contexts[i].normal)); - MatrixInvert(M, contexts[i].inverse); - nextcontext++; - } - - return(i); -} - -/* -:h3.Context() - Create a Coordinate Space for a Device - -This user operator is implemented by first finding the device context -array index, then transforming IDENTITY space to create an appropriate -cooridnate space. -*/ - -struct XYspace * -Context(pointer device, /* device token */ - double units) /* multiples of one inch */ -{ - double M[2][2]; /* device transformation matrix */ - register int n; /* will hold device context number */ - register struct XYspace *S; /* XYspace constructed */ - - ARGCHECK((device == NULL), "Context of NULLDEVICE not allowed", - NULL, IDENTITY, (0), struct XYspace *); - ARGCHECK((units == 0.0), "Context: bad units", NULL, IDENTITY, (0), struct XYspace *); - - n = FindDeviceContext(device); - - LONGCOPY(M, contexts[n].normal, sizeof(M)); - - M[0][0] *= units; - M[0][1] *= units; - M[1][0] *= units; - M[1][1] *= units; - - S = (struct XYspace *)Xform(IDENTITY, M); - - S->context = n; - return(S); -} -#endif - -/* -:h3.ConsiderContext() - Adjust a Matrix to Take Out Device Transform - -Remember, we have :f/x times U times D/ and :f/M/ and and we want :f/x -times U times M times D/. An easy way to do this is to calculate -:f/D sup <-1> times M times D/, because: -:formula. -x times U times D times D sup <-1> times M times D = x times U times M times D -:formula. -So this subroutine, given an :f/M/and an object, finds the :f/D/ for that -object and modifies :f/M/ so it is :f/D sup <-1> times M times D/. -*/ - -static void -ConsiderContext(struct xobject *obj, /* object to be transformed */ - double M[2][2]) /* matrix (may be changed) */ -{ - register int context = 0; /* index in contexts array */ - - if (obj == NULL) return; - - if (ISPATHTYPE(obj->type)) { - struct segment *path = (struct segment *) obj; - - context = path->context; - } - else if (obj->type == SPACETYPE) { - struct XYspace *S = (struct XYspace *) obj; - - context = S->context; - } - else if (obj->type == PICTURETYPE) { - - } - else - context = NULLCONTEXT; - - if (context != NULLCONTEXT) { - MatrixMultiply(contexts[context].inverse, M, M); - MatrixMultiply(M, contexts[context].normal, M); - } -} - -/* -:h2.Conversion from User's X,Y to "fractpel" X,Y - -When the user is building paths (lines, moves, curves, etc.) he passes -the control points (x,y) for the paths together with an XYspace. We -must convert from the user's (x,y) to our internal representation -which is in pels (fractpels, actually). This involves transforming -the user's (x,y) under the coordinate space transformation. It is -important that we do this quickly. So, we store pointers to different -conversion functions right in the XYspace structure. This allows us -to have simpler special case functions for the more commonly -encountered types of transformations. - -:h3.Convert(), IConvert(), and ForceFloat() - Called Through "XYspace" Structure - -These are functions that fit in the "convert" and "iconvert" function -pointers in the XYspace structure. They call the "xconvert", "yconvert", -"ixconvert", and "iyconvert" as appropriate to actually do the work. -These secondary routines come in many flavors to handle different -special cases as quickly as possible. -*/ - -static void -FXYConvert(struct fractpoint *pt, /* point to set */ - struct XYspace *S, /* relevant coordinate space */ - double x, double y) /* user's coordinates of point */ -{ - pt->x = (*S->xconvert)(S->tofract.normal[0][0], S->tofract.normal[1][0], x, y); - pt->y = (*S->yconvert)(S->tofract.normal[0][1], S->tofract.normal[1][1], x, y); -} - -static void -IXYConvert(struct fractpoint *pt, /* point to set */ - struct XYspace *S, /* relevant coordinate space */ - long x, long y) /* user's coordinates of point */ -{ - pt->x = (*S->ixconvert)(S->itofract[0][0], S->itofract[1][0], x, y); - pt->y = (*S->iyconvert)(S->itofract[0][1], S->itofract[1][1], x, y); -} - -/* -ForceFloat is a substitute for IConvert(), when we just do not have -enough significant digits in the coefficients to get high enough -precision in the answer with fixed point arithmetic. So, we force the -integers to floats, and do the arithmetic all with floats: -*/ - -static void -ForceFloat(struct fractpoint *pt, /* point to set */ - struct XYspace *S, /* relevant coordinate space */ - long x, long y) /* user's coordinates of point */ -{ - (*S->convert)(pt, S, (double) x, (double) y); -} - -/* -:h3.FXYboth(), FXonly(), FYonly() - Floating Point Conversion - -These are the routines we use when the user has given us floating -point numbers for x and y. FXYboth() is the general purpose routine; -FXonly() and FYonly() are special cases when one of the coefficients -is 0.0. -*/ - -static fractpel -FXYboth(double cx, double cy, /* x and y coefficients */ - double x, double y) /* user x,y */ -{ - register double r; /* temporary float */ - - r = x * cx + y * cy; - return((fractpel) r); -} - -/*ARGSUSED*/ -static fractpel -FXonly(double cx, double cy, /* x and y coefficients */ - double x, double y) /* user x,y */ -{ - register double r; /* temporary float */ - - r = x * cx; - return((fractpel) r); -} - -/*ARGSUSED*/ -static fractpel -FYonly(double cx, double cy, /* x and y coefficients */ - double x, double y) /* user x,y */ -{ - register double r; /* temporary float */ - - r = y * cy; - return((fractpel) r); -} - -/* -:h3.IXYboth(), IXonly(), IYonly() - Simple Integer Conversion - -These are the routines we use when the user has given us integers for -x and y, and the coefficients have enough significant digits to -provide precise answers with only "long" (32 bit?) multiplication. -IXYboth() is the general purpose routine; IXonly() and IYonly() are -special cases when one of the coefficients is 0. -*/ - -static fractpel -IXYboth(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return(x * cx + y * cy); -} - -/*ARGSUSED*/ -static fractpel -IXonly(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return(x * cx); -} - -/*ARGSUSED*/ -static fractpel -IYonly(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return(y * cy); -} - - -/* -:h3.FPXYboth(), FPXonly(), FPYonly() - More Involved Integer Conversion - -These are the routines we use when the user has given us integers for -x and y, but the coefficients do not have enough significant digits to -provide precise answers with only "long" (32 bit?) multiplication. -We have increased the number of significant bits in the coefficients -by FRACTBITS; therefore we must use "double long" (64 bit?) -multiplication by calling FPmult(). FPXYboth() is the general purpose -routine; FPXonly() and FPYonly() are special cases when one of the -coefficients is 0. - -Note that it is perfectly possible for us to calculate X with the -"FP" method and Y with the "I" method, or vice versa. It all depends -on how the functions in the XYspace structure are filled out. -*/ - -static fractpel -FPXYboth(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return( FPmult(x, cx) + FPmult(y, cy) ); -} - -/*ARGSUSED*/ -static fractpel -FPXonly(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return( FPmult(x, cx) ); -} - -/*ARGSUSED*/ -static fractpel -FPYonly(fractpel cx, fractpel cy, /* x and y coefficients */ - long x, long y) /* user x,y */ -{ - return( FPmult(y, cy) ); -} - - - -/* -:h3.FillOutFcns() - Determine the Appropriate Functions to Use for Conversion - -This function fills out the "convert" and "iconvert" function pointers -in an XYspace structure, and also fills the "helper" -functions that actually do the work. -*/ - -static void -FillOutFcns(struct XYspace *S) /* functions will be set in this structure */ -{ - S->convert = FXYConvert; - S->iconvert = IXYConvert; - - FindFfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], &S->xconvert); - FindFfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], &S->yconvert); - FindIfcn(S->tofract.normal[0][0], S->tofract.normal[1][0], - &S->itofract[0][0], &S->itofract[1][0], &S->ixconvert); - FindIfcn(S->tofract.normal[0][1], S->tofract.normal[1][1], - &S->itofract[0][1], &S->itofract[1][1], &S->iyconvert); - - if (S->ixconvert == NULL || S->iyconvert == NULL) - S->iconvert = ForceFloat; -} - -/* -:h4.FindFfcn() - Subroutine of FillOutFcns() to Fill Out Floating Functions - -This function tests for the special case of one of the coefficients -being zero: -*/ - -static void -FindFfcn(double cx, double cy, /* x and y coefficients */ - convertFunc *fcnP) /* pointer to function to set */ -{ - if (cx == 0.0) - *fcnP = FYonly; - else if (cy == 0.0) - *fcnP = FXonly; - else - *fcnP = FXYboth; -} - -/* -:h4.FindIfcn() - Subroutine of FillOutFcns() to Fill Out Integer Functions - -There are two types of integer functions, the 'I' type and the 'FP' type. -We use the I type functions when we are satisfied with simple integer -arithmetic. We used the FP functions when we feel we need higher -precision (but still fixed point) arithmetic. If all else fails, -we store a NULL indicating that this we should do the conversion in -floating point. -*/ - -static void -FindIfcn(double cx, double cy, /* x and y coefficients */ - fractpel *icxP, fractpel *icyP, /* fixed point coefficients to set */ - iconvertFunc *fcnP) /* pointer to function to set */ -{ - register fractpel imax; /* maximum of cx and cy */ - - *icxP = cx; - *icyP = cy; - - if (cx != (float) (*icxP) || cy != (float) (*icyP)) { -/* -At this point we know our integer approximations of the coefficients -are not exact. However, we will still use them if the maximum -coefficient will not fit in a 'fractpel'. Of course, we have little -choice at that point, but we haven't lost that much precision by -staying with integer arithmetic. We have enough significant digits -so that -any error we introduce is less than one part in 2:sup/16/. -*/ - - imax = MAX(ABS(*icxP), ABS(*icyP)); - if (imax < (fractpel) (1<<(FRACTBITS-1)) ) { -/* -At this point we know our integer approximations just do not have -enough significant digits for accuracy. We will add FRACTBITS -significant digits to the coefficients (by multiplying them by -1<x; - y = pt->y; - *xp = S->tofract.inverse[0][0] * x + S->tofract.inverse[1][0] * y; - *yp = S->tofract.inverse[0][1] * x + S->tofract.inverse[1][1] * y; -} - -/* -:h2.Transformations -*/ -/* -:h3 id=xform.Xform() - Transform Object in X and Y - -TYPE1IMAGER wants transformations of objects like paths to be identical -to transformations of spaces. For example, if you scale a line(1,1) -by 10 it should yield the same result as generating the line(1,1) in -a coordinate space that has been scaled by 10. - -We handle fonts by storing the accumulated transform, for example, SR -(accumulating on the right). Then when we map the font through space TD, -for example, we multiply the accumulated font transform on the left by -the space transform on the right, yielding SRTD in this case. We will -get the same result if we did S, then R, then T on the space and mapping -an unmodified font through that space. -*/ - -struct xobject * -t1_Xform(struct xobject *obj, /* object to transform */ - double M[2][2]) /* transformation matrix */ -{ - if (obj == NULL) - return(NULL); - - if (obj->type == FONTTYPE) { - register struct font *F = (struct font *) obj; - - F = UniqueFont(F); - return((struct xobject*)F); - } - if (obj->type == PICTURETYPE) { -/* -In the case of a picture, we choose both to update the picture's -transformation matrix and keep the handles up to date. -*/ - register struct picture *P = (struct picture *) obj; - register struct segment *handles; /* temporary path to transform handles */ - - P = UniquePicture(P); - handles = PathSegment(LINETYPE, P->origin.x, P->origin.y); - handles = Join(handles, - PathSegment(LINETYPE, P->ending.x, P->ending.y) ); - handles = (struct segment *)Xform((struct xobject *) handles, M); - P->origin = handles->dest; - P->ending = handles->link->dest; - KillPath(handles); - return((struct xobject *)P); - } - - if (ISPATHTYPE(obj->type)) { - struct XYspace pseudo; /* local temporary space */ - PseudoSpace(&pseudo, M); - return((struct xobject *) PathTransform((struct segment *)obj, - &pseudo)); - } - - - if (obj->type == SPACETYPE) { - register struct XYspace *S = (struct XYspace *) obj; - -/* replaced ISPERMANENT(S->flag) with S->references > 1 3-26-91 PNM */ - if (S->references > 1) - S = CopySpace(S); - else - S->ID = NEXTID; - - MatrixMultiply(S->tofract.normal, M, S->tofract.normal); - /* - * mark inverted matrix invalid: - */ - S->flag &= ~HASINVERSE(ON); - - FillOutFcns(S); - return((struct xobject *) S); - } - - return(ArgErr("Untransformable object", obj, obj)); -} - -/* -:h3.Transform() - Transform an Object - -This is the external user's entry point. -*/ -struct xobject * -t1_Transform(struct xobject *obj, - double cxx, double cyx, /* 2x2 transform matrix elements */ - double cxy, double cyy) /* in row order */ -{ - double M[2][2]; - - M[0][0] = cxx; - M[0][1] = cyx; - M[1][0] = cxy; - M[1][1] = cyy; - ConsiderContext(obj, M); - return(Xform(obj, M)); -} -/* -:h3.Scale() - Special Case of Transform() - -This is a user operator. -*/ - -struct xobject * -t1_Scale(struct xobject *obj, /* object to scale */ - double sx, double sy) /* scale factors in x and y */ -{ - double M[2][2]; - - M[0][0] = sx; - M[1][1] = sy; - M[1][0] = M[0][1] = 0.0; - ConsiderContext(obj, M); - return(Xform(obj, M)); -} - -/* -:h3 id=rotate.Rotate() - Special Case of Transform() - -We special-case different settings of 'degrees' for performance -and accuracy within the DegreeSin() and DegreeCos() routines themselves. -*/ - -#ifdef notdef -struct xobject * -xiRotate(struct xobject *obj, /* object to be transformed */ - double degrees) /* degrees of COUNTER-clockwise rotation */ -{ - double M[2][2]; - - M[0][0] = M[1][1] = DegreeCos(degrees); - M[1][0] = - (M[0][1] = DegreeSin(degrees)); - ConsiderContext(obj, M); - return(Xform(obj, M)); -} -#endif - -/* -:h3.PseudoSpace() - Build a Coordinate Space from a Matrix - -Since we have built all this optimized code that, given an (x,y) and -a coordinate space, yield transformed (x,y), it seems a shame not to -use the same logic when we need to multiply an (x,y) by an arbitrary -matrix that is not (initially) part of a coordinate space. This -subroutine takes the arbitrary matrix and builds a coordinate -space, with all its nifty function pointers. -*/ - -void -PseudoSpace(struct XYspace *S, /* coordinate space structure to fill out */ - double M[2][2]) /* matrix that will become 'tofract.normal' */ -{ - S->type = SPACETYPE; - S->flag = ISPERMANENT(ON) + ISIMMORTAL(ON); - S->references = 2; /* 3-26-91 added PNM */ - S->tofract.normal[0][0] = M[0][0]; - S->tofract.normal[1][0] = M[1][0]; - S->tofract.normal[0][1] = M[0][1]; - S->tofract.normal[1][1] = M[1][1]; - - FillOutFcns(S); -} - -/* -:h2 id=matrixa.Matrix Arithmetic - -Following the convention in Newman and Sproull, :hp1/Interactive -Computer Graphics/, -matrices are organized: -:xmp. - | cxx cyx | - | cxy cyy | -:exmp. -A point is horizontal, for example: -:xmp. - [ x y ] -:exmp. -This means that: -:formula/x prime = cxx times x + cxy times y/ -:formula/y prime = cyx times x + cyy times y/ -I've seen the other convention, where transform matrices are -transposed, equally often in the literature. -*/ - -/* -:h3.MatrixMultiply() - Implements Multiplication of Two Matrices - -Implements matrix multiplication, A * B = C. - -To remind myself, matrix multiplication goes rows of A times columns -of B. -The output matrix may be the same as one of the input matrices. -*/ -void -MatrixMultiply(double A[2][2], double B[2][2], /* input matrices */ - double C[2][2]) /* output matrix */ -{ - register double txx,txy,tyx,tyy; - - txx = A[0][0] * B[0][0] + A[0][1] * B[1][0]; - txy = A[1][0] * B[0][0] + A[1][1] * B[1][0]; - tyx = A[0][0] * B[0][1] + A[0][1] * B[1][1]; - tyy = A[1][0] * B[0][1] + A[1][1] * B[1][1]; - - C[0][0] = txx; - C[1][0] = txy; - C[0][1] = tyx; - C[1][1] = tyy; -} -/* -:h3.MatrixInvert() - Invert a Matrix - -My reference for matrix inversion was :hp1/Elementary Linear Algebra/ -by Paul C. Shields, Worth Publishers, Inc., 1968. -*/ -void -MatrixInvert(double M[2][2], /* input matrix */ - double Mprime[2][2]) /* output inverted matrix */ -{ - register double D; /* determinant of matrix M */ - register double txx,txy,tyx,tyy; - - txx = M[0][0]; - txy = M[1][0]; - tyx = M[0][1]; - tyy = M[1][1]; - - D = M[1][1] * M[0][0] - M[1][0] * M[0][1]; - if (D == 0.0) - Abort("MatrixInvert: can't"); - - Mprime[0][0] = tyy / D; - Mprime[1][0] = -txy / D; - Mprime[0][1] = -tyx / D; - Mprime[1][1] = txx / D; -} -/* -:h2.Initialization, Queries, and Debug -*/ -/* -:h3.InitSpaces() - Initialize Constant Spaces - -For compatibility, we initialize a coordinate space called USER which -maps 72nds of an inch to pels on the default device. -*/ - -struct XYspace *USER = &identity; - -void -InitSpaces(void) -{ - IDENTITY->type = SPACETYPE; - FillOutFcns(IDENTITY); - - contexts[NULLCONTEXT].normal[1][0] - = contexts[NULLCONTEXT].normal[0][1] - = contexts[NULLCONTEXT].inverse[1][0] - = contexts[NULLCONTEXT].inverse[0][1] = 0.0; - contexts[NULLCONTEXT].normal[0][0] - = contexts[NULLCONTEXT].normal[1][1] - = contexts[NULLCONTEXT].inverse[0][0] - = contexts[NULLCONTEXT].inverse[1][1] = 1.0; - - USER->flag |= ISIMMORTAL(ON); - CoerceInverse(USER); -} -/* -:h3.QuerySpace() - Returns the Transformation Matrix of a Space - -Since the tofract matrix of an XYspace includes the scale factor -necessary to produce fractpel results (i.e., FRACTFLOAT), this -must be taken out before we return the matrix to the user. Fortunately, -this is simple: just multiply by the inverse of IDENTITY! -*/ - -void -QuerySpace(struct XYspace *S, /* space asked about */ - double *cxxP, double *cyxP, /* where to put answer */ - double *cxyP, double *cyyP) -{ - double M[2][2]; /* temp matrix to build user's answer */ - - if (S->type != SPACETYPE) { - ArgErr("QuerySpace: not a space", S, NULL); - return; - } - MatrixMultiply(S->tofract.normal, IDENTITY->tofract.inverse, M); - *cxxP = M[0][0]; - *cxyP = M[1][0]; - *cyxP = M[0][1]; - *cyyP = M[1][1]; -} - -/* -:h3.FormatFP() - Format a Fixed Point Pel - -We format the pel as "dddd.XXXX", where XX's are hexidecimal digits, -and the dd's are decimal digits. This might be a little confusing -mixing hexidecimal and decimal like that, but it is convenient -to use for debug. - -We make sure we have N (FRACTBITS/4) digits past the decimal point. -*/ -#define FRACTMASK ((1<> FRACTBITS), s); -} - -/* -:h3.DumpSpace() - Display a Coordinate Space -*/ -/*ARGSUSED*/ -void -DumpSpace(struct XYspace *S) -{ -} diff --git a/nx-X11/lib/font/Type1/spaces.h b/nx-X11/lib/font/Type1/spaces.h deleted file mode 100644 index ef78f2f47..000000000 --- a/nx-X11/lib/font/Type1/spaces.h +++ /dev/null @@ -1,172 +0,0 @@ -/* $Xorg: spaces.h,v 1.3 2000/08/17 19:46:32 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/spaces.h,v 3.3 1999/08/22 08:58:53 dawes Exp $ */ - -/*SHARED*/ - -#define USER t1_User -#define IDENTITY t1_Identity - -#define Context(d,u) t1_Context(d,u) -#define Transform(o,f1,f2,f3,f4) t1_Transform(o,f1,f2,f3,f4) -#define Rotate(o,d) t1_Rotate(o,d) -#define Scale(o,sx,sy) t1_Scale(o,sx,sy) -#define QuerySpace(S,f1,f2,f3,f4) t1_QuerySpace(S,f1,f2,f3,f4) -#define Warp(s1,o,s2) t1_Warp(s1,o,s2) - -/* IDENTITY space */ -extern struct XYspace *IDENTITY; - -/* creates a coordinate space for a device */ -extern struct XYspace *Context(pointer device, double units); -/* transform an object */ -extern struct xobject *t1_Transform ( struct xobject *obj, double cxx, - double cyx, double cxy, double cyy ); -#if 0 -struct xobject *t1_Rotate(); /* rotate an object */ -#endif -/* scale an object */ -extern struct xobject *t1_Scale ( struct xobject *obj, double sx, double sy ); -#if 0 -struct xobject *t1_Warp(); /* transform like delta of two spaces */ -#endif -/* returns coordinate space matrix */ -extern void t1_QuerySpace ( struct XYspace *S, double *cxxP, double *cyxP, - double *cxyP, double *cyyP ); - -/*END SHARED*/ -/*SHARED*/ - -/* #define KillSpace(s) Free(s) -Note - redefined KillSpace() to check references ! -3-26-91 PNM */ - -#define KillSpace(s) if ( (--(s->references) == 0) ||\ - ( (s->references == 1) && ISPERMANENT(s->flag) ) )\ - Free(s) - -#define ConsumeSpace(s) MAKECONSUME(s,KillSpace(s)) -#define UniqueSpace(s) MAKEUNIQUE(s,CopySpace(s)) - -/*END SHARED*/ -/*SHARED*/ - -typedef short pel; /* integer pel locations */ -typedef long fractpel; /* fractional pel locations */ - -#define FRACTBITS 16 /* number of fractional bits in 'fractpel' */ -/* -We define the following macros to convert from 'fractpel' to 'pel' and -vice versa: -*/ -#define TOFRACTPEL(p) (((fractpel)p)<>FRACTBITS) -#define FRACTFLOAT (double)(1L< -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include -#if XFONT_CID -#include -#include -#include -#endif -#ifdef _XOPEN_SOURCE -#include -#else -#define _XOPEN_SOURCE /* to get prototype for hypot on some systems */ -#include -#undef _XOPEN_SOURCE -#endif -#include "X11/Xfuncs.h" -#ifdef USE_MMAP -#include -#include -#endif -#else -#include "Xmd.h" -#include "Xdefs.h" -#endif - -#ifdef FONTMODULE -#include "os.h" -#include "xf86_ansic.h" -#endif - -#include -#include -#include -#include -#include "t1unicode.h" - -#if XFONT_CID -#include "range.h" -#endif - -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "t1stdio.h" -#include "util.h" -#include "fontfcn.h" -#include "t1intf.h" - - -static int Type1GetGlyphs ( FontPtr pFont, unsigned long count, - unsigned char *chars, FontEncoding charEncoding, - unsigned long *glyphCount, CharInfoPtr *glyphs ); - -#if XFONT_CID -#define CMapDir "/CMap/" -#define CFMDir "/CFM/" -#define CIDFontDir "/CIDFont/" -#endif - -static int Type1GetMetrics ( FontPtr pFont, unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, - xCharInfo **glyphs ); - - -#define minchar(p) ((p).min_char_low + ((p).min_char_high << 8)) -#define maxchar(p) ((p).max_char_low + ((p).max_char_high << 8)) - -static void fillrun ( char *p, pel x0, pel x1, int bit ); - -extern psfont *FontP; -extern psobj *ISOLatin1EncArrayP; - -#if XFONT_CID -extern char CurCIDFontName[]; -extern char CurCMapName[]; - -static CharInfoPtr CIDGetGlyph ( FontPtr pFont, unsigned int charcode, - CharInfoPtr pci ); - -extern cidfont *CIDFontP; -extern cmapres *CMapP; -#endif - -static void fill ( char *dest, int h, int w, struct region *area, int byte, - int bit, int wordsize ); - -#if XFONT_CID -int -CIDOpenScalable (FontPathElementPtr fpe, - FontPtr *ppFont, - int flags, - FontEntryPtr entry, - char *fileName, - FontScalablePtr vals, - fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font) /* We don't do licensing */ -{ - FontPtr pFont; - int bit, - byte, - glyph, - scan, - image; - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - register int i; - int nchars, len, rc; - cidglyphs *cid; - char *p; - double t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - char CIDFontName[CID_NAME_MAX]; - char CMapName[CID_NAME_MAX]; - char cidfontname[CID_PATH_MAX]; - char cmapname[CID_PATH_MAX]; - char *path; - char cidfontpath[CID_PATH_MAX]; - char cmappath[CID_PATH_MAX]; -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - char cfmdir[CID_PATH_MAX]; - char cfmfilename[CID_NAME_MAX]; -#endif -#if defined(CID_ALL_CHARS) - char *cf; -#else - long sAscent, sDescent; -#endif - - /* check the font name */ - len = strlen(fileName); - if (len <= 0 || len > CID_NAME_MAX - 1) - return BadFontName; - -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - strcpy(cfmdir, fileName); - p = strrchr(cfmdir, '/'); - if (p) *p = '\0'; -#endif - - path = fileName; - if (!(fileName = strrchr(fileName, '/'))) - return BadFontName; - - len = fileName - path; - strncpy(cidfontpath, path, len); - cidfontpath[len] = '\0'; - strcpy(cmappath, cidfontpath); - strcat(cmappath, CMapDir); -#ifdef HAVE_CFM - strcpy(cfmdir, cidfontpath); - strcat(cfmdir, CFMDir); -#endif - strcat(cidfontpath, CIDFontDir); - - fileName++; - - /* extract the CIDFontName and CMapName from the font name */ - /* check for -- */ - if ((p = strstr(fileName, "--"))) { - if (p == fileName) - return BadFontName; - else { - strcpy(CIDFontName, fileName); - CIDFontName[p - fileName] = '\0'; - p += 2; - i = 0; - while (*p && *p != '.') - CMapName[i++] = *p++; - CMapName[i] = '\0'; - if ((len = strlen(CMapName)) <= 0) - return BadFontName; - } - } else - return BadFontName; - - /* The CMap files whose names end with -V are not yet supported */ - len = strlen(CMapName); - if ((len >= 2 && CMapName[len - 2] == '-' && CMapName[len - 1] == 'V') || - (len == 1 && CMapName[len - 1] == 'V')) - return BadFontName; - - /* Reject ridiculously small font sizes that will blow up the math */ - if (hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]) < 1.0 || - hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) - return BadFontName; - -#ifdef CID_ALL_CHARS - if ((cf = getenv("CFMDIR")) == NULL) - strcat(cfmdir, CFMDir); - else { - strcpy(cfmdir, cf); - strcat(cfmdir, "/"); - } -#endif - -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - strcpy(cfmfilename, cfmdir); - strcat(cfmfilename, CIDFontName); - strcat(cfmfilename, "--"); - strcat(cfmfilename, CMapName); - strcat(cfmfilename, ".cfm"); -#endif - - /* create a full-path name for a CIDFont file */ - if (strlen(cidfontpath) + strlen(CIDFontName) + 2 > - CID_PATH_MAX) - return BadFontName; - strcpy(cidfontname, cidfontpath); - strcat(cidfontname, CIDFontName); - - /* create a full-path name for a CMap file */ - if (strlen(cmappath) + strlen(CMapName) + 2 > CID_PATH_MAX) - return BadFontName; - strcpy(cmapname, cmappath); - strcat(cmapname, CMapName); - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) - return rc; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - if (!(pFont = CreateFontRec())) - return AllocError; - - cid = (cidglyphs *)xalloc(sizeof(cidglyphs)); - if (cid == NULL) { - DestroyFontRec(pFont); - return AllocError; - } - bzero(cid, sizeof(cidglyphs)); - - /* heuristic for "maximum" size of pool we'll need: */ - size = 200000 + 600 * - (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - - addmemory(pool, size); - - /* load font if not already loaded */ - if (!CIDfontfcnA(cidfontname, cmapname, &rc)) { - FontP = NULL; - delmemory(); - xfree(pool); - xfree(cid); - DestroyFontRec(pFont); - return Type1ReturnCodeToXReturnCode(rc); - } - - FontP = NULL; - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - vals->pixel_matrix[0], - -vals->pixel_matrix[1], - vals->pixel_matrix[2], - -vals->pixel_matrix[3])); - - /* multiplier for computation of raw values */ - sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - pFont->info.firstRow = CMapP->firstRow; - pFont->info.firstCol = CMapP->firstCol; - pFont->info.lastRow = CMapP->lastRow; - pFont->info.lastCol = CMapP->lastCol; - - nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * - (pFont->info.lastCol - pFont->info.firstCol + 1); - - delmemory(); - xfree(pool); - - if (pFont->info.firstCol > pFont->info.lastCol) - { - xfree(cid); - DestroyFontRec(pFont); - return BadFontName; - } - - cid->glyphs = (CharInfoRec **)xalloc(nchars*sizeof(CharInfoRec *)); - if (cid->glyphs == NULL) { - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - bzero(cid->glyphs, nchars*sizeof(CharInfoRec *)); - - pFont->info.defaultCh = 0; - pFont->format = format; - - pFont->bit = bit; - pFont->byte = byte; - pFont->glyph = glyph; - pFont->scan = scan; - - pFont->get_metrics = CIDGetMetrics; - pFont->get_glyphs = CIDGetGlyphs; - pFont->unload_font = CIDCloseFont; - pFont->unload_glyphs = NULL; - pFont->refcnt = 0; - - len = strlen(cidfontname); - cid->CIDFontName = (char *)xalloc(len + 1); - if (cid->CIDFontName == NULL) { - xfree(cid->glyphs); - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - strcpy(cid->CIDFontName, cidfontname); - - len = strlen(cmapname); - cid->CMapName = (char *)xalloc(len + 1); - if (cid->CMapName == NULL) { - xfree(cid->CIDFontName); - xfree(cid->glyphs); - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - strcpy(cid->CMapName, cmapname); - - cid->pixel_matrix[0] = vals->pixel_matrix[0]; - cid->pixel_matrix[1] = vals->pixel_matrix[1]; - cid->pixel_matrix[2] = vals->pixel_matrix[2]; - cid->pixel_matrix[3] = vals->pixel_matrix[3]; - - pFont->fontPrivate = (unsigned char *)cid; - - pFont->info.fontAscent = - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer * - vals->pixel_matrix[3] + - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer > - 0 ? 500 : -500)) / 1000; - - pFont->info.fontDescent = - -(int)((double)CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer - * vals->pixel_matrix[3] + - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer > - 0 ? 500 : -500)) / 1000; - - /* Adobe does not put isFixedPitch entries in CID-keyed fonts. */ - /* CID-keyed are not constant-width fonts. */ - pFont->info.constantWidth = 0; - -#ifndef CID_ALL_CHARS - sAscent = CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer; - sDescent = -CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer; -#endif - - if (strncmp(entry->name.name, "-bogus", 6)) { -#ifdef CID_ALL_CHARS - ComputeBoundsAllChars(pFont, cfmfilename, sxmult); -#else -#ifdef HAVE_CFM - CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, - cfmfilename, sAscent, sDescent, sxmult); -#else - CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, - sAscent, sDescent, sxmult); -#endif /* HAVE_CFM */ -#endif /* CID_ALL_CHARS */ - } - - *ppFont = pFont; - - return Successful; -} -#endif - -/*ARGSUSED*/ -int -Type1OpenScalable (FontPathElementPtr fpe, - FontPtr *ppFont, - int flags, - FontEntryPtr entry, - char *fileName, - FontScalablePtr vals, - fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font) /* We don't do licensing */ -{ - FontPtr pFont; - int bit, - byte, - glyph, - scan, - image; - int pad,wordsize; /* scan & image in bits */ - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - struct region *area; - CharInfoRec *glyphs; - int len, rc, count = 0, i = 0; - struct type1font *type1; - char *p; - FontMapPtr mapping = NULL; - int no_mapping; - psobj *fontmatrix; - long x0, total_width = 0, total_raw_width = 0; - double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - - /* Reject ridiculously small font sizes that will blow up the math */ - if (hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]) < 1.0 || - hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) - return BadFontName; - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) - return rc; - - pad = glyph * 8; - wordsize = scan * 8; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - pFont = CreateFontRec(); - if (pFont == NULL) - return AllocError; - - type1 = (struct type1font *)xalloc(sizeof(struct type1font)); - if (type1 == NULL) { - DestroyFontRec(pFont); - return AllocError; - } - bzero(type1, sizeof(struct type1font)); - - /* heuristic for "maximum" size of pool we'll need: */ -#if XFONT_CID - size = 400000 + 600 * -#else - size = 200000 + 600 * -#endif - (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - xfree(type1); - DestroyFontRec(pFont); - return AllocError; - } - - addmemory(pool, size); - - - glyphs = type1->glyphs; - - /* load font if not already loaded */ - if (!fontfcnA(fileName, &rc)) { - delmemory(); - xfree(type1); - DestroyFontRec(pFont); - xfree(pool); - return Type1ReturnCodeToXReturnCode(rc); - } - - fontmatrix = &FontP->fontInfoP[FONTMATRIX].value; - if (objPIsArray(fontmatrix) && fontmatrix->len == 6) - { -#define assign(n,d,f) if (objPIsInteger(fontmatrix->data.arrayP + n)) \ - d = fontmatrix->data.arrayP[n].data.integer; \ - else if (objPIsReal(fontmatrix->data.arrayP + n)) \ - d = fontmatrix->data.arrayP[n].data.real; \ - else d = f; - - assign(0, t1, .001); - assign(1, t2, 0.0); - assign(2, t3, 0.0); - assign(3, t4, .001); - } - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - vals->pixel_matrix[0], - -vals->pixel_matrix[1], - vals->pixel_matrix[2], - -vals->pixel_matrix[3])); - - - /* multiplier for computation of raw values */ - sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - no_mapping=0; - p = FontEncFromXLFD(entry->name.name, entry->name.length); - - if(p==0) { /* XLFD does not specify an encoding */ - mapping=0; - no_mapping=2; /* ISO 8859-1 */ - } - - if(!strcmp(p, "adobe-fontspecific")) { - mapping=0; - no_mapping=1; /* font's native encoding vector */ - } - - pFont->info.firstCol = 255; - pFont->info.lastCol = 0; - - if(!no_mapping) { - mapping = FontEncMapFind(p, - FONT_ENCODING_POSTSCRIPT, -1, -1, - fileName); - if(!mapping) - mapping = FontEncMapFind(p, - FONT_ENCODING_UNICODE, -1, -1, - fileName); - if(!mapping) - goto NoEncoding; - else - no_mapping=0; - } - - for (i=0; i < 256; i++) { - long h,w; - long paddedW; - int j; - char *codename; - - if(no_mapping == 1) { - codename = FontP->fontInfoP[ENCODING]. - value.data.arrayP[i].data.valueP; - len = FontP->fontInfoP[ENCODING]. - value.data.arrayP[i].len; - } else if(no_mapping) { - codename = unicodetoPSname(i); - len = codename ? strlen(codename) : 0; - } else { - if(mapping->type == FONT_ENCODING_UNICODE) { - codename = unicodetoPSname(FontEncRecode(i, mapping)); - } else - codename = FontEncName(i, mapping); - len=codename?strlen(codename):0; - } - - /* Avoid multiply rasterising the undefined glyph */ - if(len==7 && !strncmp(codename, ".notdef", 7)) { - len=0; - codename=0; - } - - /* But do rasterise it at least once */ - if(len==0) { - if(i==0) { - codename=".notdef"; - len=7; - } else - continue; - } - - /* See if this character is in the list of ranges specified - in the XLFD name */ - if(i!=0) { - for (j = 0; j < vals->nranges; j++) - if (i >= minchar(vals->ranges[j]) && - i <= maxchar(vals->ranges[j])) - break; - - /* If not, don't realize it. */ - if (vals->nranges && j == vals->nranges) - continue; - } - - rc = 0; - area = (struct region *)fontfcnB(S, (unsigned char *)codename, - &len, &rc); - if (rc < 0) { - rc = Type1ReturnCodeToXReturnCode(rc); - break; - } - else if (rc > 0) - continue; - - if (area == NULL) - continue; - - if (pFont->info.firstCol > i) - pFont->info.firstCol = i; - if (pFont->info.lastCol < i) - pFont->info.lastCol = i; - - h = area->ymax - area->ymin; - w = area->xmax - area->xmin; - paddedW = PAD(w, pad); - - if (h > 0 && w > 0) { - size = h * paddedW / 8; - glyphs[i].bits = (char *)xalloc(size); - if (glyphs[i].bits == NULL) { - rc = AllocError; - break; - } - } - else { - size = 0; - h = w = 0; - area->xmin = area->xmax = 0; - area->ymax = area->ymax = 0; - } - - glyphs[i].metrics.leftSideBearing = area->xmin; - x1 = (double)(x0 = area->ending.x - area->origin.x); - y1 = (double)(area->ending.y - area->origin.y); - glyphs[i].metrics.characterWidth = - (x0 + (x0 > 0 ? FPHALF : -FPHALF)) / (1 << FRACTBITS); - if (!glyphs[i].metrics.characterWidth && size == 0) - { - /* Zero size and zero extents: presumably caused by - the choice of transformation. Let's create a - small bitmap so we're not mistaken for an undefined - character. */ - h = w = 1; - size = paddedW = PAD(w, pad); - glyphs[i].bits = (char *)xalloc(size); - if (glyphs[i].bits == NULL) { - rc = AllocError; - break; - } - } - glyphs[i].metrics.attributes = - NEARESTPEL((long)(hypot(x1, y1) * sxmult)); - total_width += glyphs[i].metrics.attributes; - total_raw_width += abs((int)(INT16)glyphs[i].metrics.attributes); - count++; - glyphs[i].metrics.rightSideBearing = w + area->xmin; - glyphs[i].metrics.descent = area->ymax - NEARESTPEL(area->origin.y); - glyphs[i].metrics.ascent = h - glyphs[i].metrics.descent; - - - bzero(glyphs[i].bits, size); - if (h > 0 && w > 0) { - fill(glyphs[i].bits, h, paddedW, area, byte, bit, wordsize ); - } - - Destroy(area); - } - NoEncoding: - - delmemory(); - xfree(pool); - - if (pFont->info.firstCol > pFont->info.lastCol) - { - xfree(type1); - DestroyFontRec(pFont); - return BadFontName; - } - - if (i != 256) { - for (i--; i >= 0; i--) - if (glyphs[i].bits != NULL) - xfree(glyphs[i].bits); - xfree(type1); - DestroyFontRec(pFont); - return rc; - } - type1->pDefault = NULL; - - pFont->format = format; - - pFont->bit = bit; - pFont->byte = byte; - pFont->glyph = glyph; - pFont->scan = scan; - - pFont->info.firstRow = 0; - pFont->info.lastRow = 0; - - pFont->get_metrics = Type1GetMetrics; - pFont->get_glyphs = Type1GetGlyphs; - pFont->unload_font = Type1CloseFont; - pFont->unload_glyphs = NULL; - pFont->refcnt = 0; - - pFont->fontPrivate = (unsigned char *) type1; - - if (count) - { - total_raw_width = (total_raw_width * 10 + count / 2) / count; - if (total_width < 0) - { - /* Predominant direction is R->L */ - total_raw_width = -total_raw_width; - } - vals->width = (int)((double)total_raw_width * - vals->pixel_matrix[0] / 1000.0 + - (vals->pixel_matrix[0] > 0 ? .5 : -.5)); - } - - T1FillFontInfo(pFont, vals, fileName, entry->name.name, total_raw_width); - - *ppFont = pFont; - return Successful; -} - -#if XFONT_CID -unsigned int -getCID(FontPtr pFont, unsigned int charcode) -{ - unsigned int cidcode = 0; - Bool charvalid = FALSE; - cidglyphs *cid; - int i, j; - unsigned int char_row, char_col, rangelo_row, rangelo_col, k; - unsigned int rangehi_row, rangehi_col; - spacerange *spacerangeP; - cidrange *notdefrangeP, *cidrangeP; - - cid = (cidglyphs *)pFont->fontPrivate; - - if (cid == NULL) - return cidcode; - - char_row = (charcode >> 8) & 0xff; - char_col = charcode & 0xff; - - spacerangeP = CIDFontP->spacerangeP; - for (i = 0; i < CIDFontP->spacerangecnt; i++) { - for (j = 0; j < spacerangeP->rangecnt; j++) { - rangelo_row = - (spacerangeP->spacecode[j].srcCodeLo >> 8) & 0xff; - rangelo_col = spacerangeP->spacecode[j].srcCodeLo & 0xff; - rangehi_row = - (spacerangeP->spacecode[j].srcCodeHi >> 8) & 0xff; - rangehi_col = spacerangeP->spacecode[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - break; - } - } - if (charvalid) break; - spacerangeP = spacerangeP->next; - } - - if (charvalid) { - charvalid = FALSE; - cidrangeP = CIDFontP->cidrangeP; - for (i = 0; i < CIDFontP->cidrangecnt; i++) { - for (j = 0; j < cidrangeP->rangecnt; j++) { - rangelo_row = - (cidrangeP->range[j].srcCodeLo >> 8) & 0xff; - rangelo_col = cidrangeP->range[j].srcCodeLo & 0xff; - rangehi_row = - (cidrangeP->range[j].srcCodeHi >> 8) & 0xff; - rangehi_col = cidrangeP->range[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - for (k = cidrangeP->range[j].srcCodeLo; - k <= cidrangeP->range[j].srcCodeHi; k++) { - if (k == charcode) - cidcode = cidrangeP->range[j].dstCIDLo + k - - cidrangeP->range[j].srcCodeLo; - } - break; - } - } - if (charvalid) break; - cidrangeP = cidrangeP->next; - } - } - - if (charvalid) { - charvalid = FALSE; - notdefrangeP = CIDFontP->notdefrangeP; - for (i = 0; i < CIDFontP->notdefrangecnt; i++) { - for (j = 0; j < notdefrangeP->rangecnt; j++) { - rangelo_row = - (notdefrangeP->range[j].srcCodeLo >> 8) & 0xff; - rangelo_col = notdefrangeP->range[j].srcCodeLo & 0xff; - rangehi_row = - (notdefrangeP->range[j].srcCodeHi >> 8) & 0xff; - rangehi_col = notdefrangeP->range[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - for (k = notdefrangeP->range[j].srcCodeLo; - k <= notdefrangeP->range[j].srcCodeHi; k++) { - if (k == charcode) - /* the whole range is mapped to a single CID code */ - cidcode = notdefrangeP->range[j].dstCIDLo; - } - break; - } - } - if (charvalid) break; - notdefrangeP = notdefrangeP->next; - } - } - - /* If you specify a CMap that has more CIDs than a specified CIDFont, */ - /* the program could go beyond the number of entries in CIDMap. Make */ - /* sure that that does not happen. */ - if (cidcode < CIDFontP->CIDfontInfoP[CIDCOUNT].value.data.integer) - return cidcode; - else - return 0; -} - -static CharInfoPtr -CIDGetGlyph(FontPtr pFont, unsigned int charcode, CharInfoPtr pci) -{ - int rc; - CharInfoPtr cp = NULL; - unsigned int cidcode; - - /* character code -> CID */ - cidcode = getCID(pFont, charcode); - - cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); - - if (rc != Successful && cidcode) { - cidcode = 0; - cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); - } - - return cp; -} - -int -CIDGetGlyphs(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - CharInfoPtr *glyphs) /* RETURN */ -{ - unsigned int code, char_row, char_col; - CharInfoPtr *glyphsBase; - register unsigned int c; - CharInfoPtr pci; - CharInfoPtr pDefault; - cidglyphs *cid; - register int firstCol; - int rc = 0; - int cid_valid = 0; - - cid = (cidglyphs *)pFont->fontPrivate; - - FontP = NULL; - - firstCol = pFont->info.firstCol; - pDefault = cid->pDefault; - glyphsBase = glyphs; - - switch (charEncoding) { - -#define EXIST(pci) \ - ((pci)->metrics.attributes || \ - (pci)->metrics.ascent != -(pci)->metrics.descent || \ - (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) - - case Linear8Bit: - case TwoD8Bit: - if (pFont->info.firstRow > 0) - break; - while (count--) { - c = (*chars++); - if (c >= firstCol && c <= pFont->info.lastCol) { - code = c - firstCol; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - case Linear16Bit: - while (count--) { - char_row = *chars++; - char_col = *chars++; - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - - case TwoD16Bit: - while (count--) { - char_row = (*chars++); - char_col = (*chars++); - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - } - *glyphCount = glyphs - glyphsBase; - return Successful; - -#undef EXIST -} -#endif - -static int -Type1GetGlyphs(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - CharInfoPtr *glyphs) /* RETURN */ -{ - unsigned int firstRow; - unsigned int numRows; - CharInfoPtr *glyphsBase; - register unsigned int c; - register CharInfoPtr pci; - unsigned int r; - CharInfoPtr pDefault; - register struct type1font *type1Font; - register int firstCol; - - type1Font = (struct type1font *) pFont->fontPrivate; - firstCol = pFont->info.firstCol; - pDefault = type1Font->pDefault; - glyphsBase = glyphs; - - switch (charEncoding) { - -#define EXIST(pci) \ - ((pci)->metrics.attributes || \ - (pci)->metrics.ascent != -(pci)->metrics.descent || \ - (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) - - case Linear8Bit: - case TwoD8Bit: - if (pFont->info.firstRow > 0) - break; - while (count--) { - c = (*chars++); - if (c >= firstCol && - (pci = &type1Font->glyphs[c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - case Linear16Bit: - while (count--) { - c = *chars++ << 8; - c = (c | *chars++); - if (c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - - case TwoD16Bit: - firstRow = pFont->info.firstRow; - numRows = pFont->info.lastRow - firstRow + 1; - while (count--) { - r = (*chars++) - firstRow; - c = (*chars++); - if (r < numRows && c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[(r << 8) + c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - } - *glyphCount = glyphs - glyphsBase; - return Successful; - -#undef EXIST -} - -#if XFONT_CID -static CharInfoRec nonExistantChar; - -int -CIDGetMetrics(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - xCharInfo **glyphs) /* RETURN */ -{ - int ret; - cidglyphs *cid; - CharInfoPtr oldDefault; - char cidafmname[CID_PATH_MAX]; - char CIDFontName[CID_NAME_MAX]; - char *ptr; - - cid = (cidglyphs *)pFont->fontPrivate; - - strcpy(cidafmname, cid->CIDFontName); - if (!(ptr = strrchr(cidafmname, '/'))) - return BadFontName; - - *ptr = '\0'; - - strcpy(CIDFontName, ptr + 1); - - if (!(ptr = strrchr(cidafmname, '/'))) - return BadFontName; - - *ptr = '\0'; - - strcat(cidafmname, "/AFM/"); - strcat(cidafmname, CIDFontName); - - strcat(cidafmname, ".afm"); - - oldDefault = cid->pDefault; - cid->pDefault = &nonExistantChar; - - ret = CIDGetAFM(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr -*)glyphs, cidafmname); - if (ret != Successful) - ret = CIDGetGlyphs(pFont, count, chars, charEncoding, glyphCount, - (CharInfoPtr *)glyphs); - - *ptr = 0; - cid->pDefault = oldDefault; - return ret; -} -#endif - -static int -Type1GetMetrics(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - xCharInfo **glyphs) /* RETURN */ -{ - static CharInfoRec nonExistantChar; - - int ret; - struct type1font *type1Font; - CharInfoPtr oldDefault; - - type1Font = (struct type1font *) pFont->fontPrivate; - oldDefault = type1Font->pDefault; - type1Font->pDefault = &nonExistantChar; - ret = Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr *) glyphs); - type1Font->pDefault = oldDefault; - return ret; -} - -#if XFONT_CID -void -CIDCloseFont(FontPtr pFont) -{ - register int i; - cidglyphs *cid; - int nchars; - - if (pFont) { - - cid = (cidglyphs *)pFont->fontPrivate; - - if (cid) { - - if (cid->CIDFontName && !strcmp(cid->CIDFontName, CurCIDFontName) - && cid->CMapName && !strcmp(cid->CMapName, CurCMapName)){ - strcpy(CurCIDFontName, ""); /* initialize to none */ - strcpy(CurCMapName, ""); /* initialize to none */ - } - - if (cid->CIDFontName) - xfree(cid->CIDFontName); - - if (cid->CMapName) - xfree(cid->CMapName); - - nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * - (pFont->info.lastCol - pFont->info.firstCol + 1); - - for (i = 0; i < nchars; i++) { - if (cid->glyphs[i] && (cid->glyphs[i] != &nonExistantChar)) { - if (cid->glyphs[i]->bits) - xfree(cid->glyphs[i]->bits); - xfree(cid->glyphs[i]); - } - } - - if (cid->glyphs) - xfree(cid->glyphs); - - if (cid->AFMinfo) - xfree(cid->AFMinfo); -#ifdef USE_MMAP - if (cid->CIDdata) - munmap(cid->CIDdata, cid->CIDsize); -#endif - xfree(cid); - } - - if (pFont->info.props) - xfree(pFont->info.props); - - if (pFont->info.isStringProp) - xfree(pFont->info.isStringProp); - - DestroyFontRec(pFont); - } -} -#endif - -void -Type1CloseFont(FontPtr pFont) -{ - register int i; - struct type1font *type1; - - type1 = (struct type1font *) pFont->fontPrivate; - for (i=0; i < 256; i++) - if (type1->glyphs[i].bits != NULL) - xfree(type1->glyphs[i].bits); - xfree(type1); - - if (pFont->info.props) - xfree(pFont->info.props); - - if (pFont->info.isStringProp) - xfree(pFont->info.isStringProp); - - DestroyFontRec(pFont); -} - -static void -fill(char *dest, /* destination bitmap */ - int h, int w, /* dimensions of 'dest', w padded */ - struct region *area, /* region to write to 'dest' */ - int byte, int bit, /* flags; LSBFirst or MSBFirst */ - int wordsize) /* number of bits per word for LSB/MSB purposes */ -{ - register struct edgelist *edge; /* for looping through edges */ - register char *p; /* current scan line in 'dest' */ - register int y; /* for looping through scans */ - register int wbytes = w / 8; /* number of bytes in width */ - register pel *leftP,*rightP; /* pointers to X values, left and right */ - int xmin = area->xmin; /* upper left X */ - int ymin = area->ymin; /* upper left Y */ - - for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { - - p = dest + (edge->ymin - ymin) * wbytes; - leftP = edge->xvalues; - rightP = edge->link->xvalues; - - for (y = edge->ymin; y < edge->ymax; y++) { - fillrun(p, *leftP++ - xmin, *rightP++ - xmin, bit); - p += wbytes; - } - } -/* -Now, as an afterthought, we'll go reorganize if odd byte order requires -it: -*/ - if (byte == LSBFirst && wordsize != 8) { - register int i; - - switch (wordsize) { - case 16: - { - register unsigned short data,*p; - - p = (unsigned short *) dest; - - for (i = h * w /16; --i >= 0;) { - data = *p; - *p++ = (data << 8) + (data >> 8); - } - break; - } - case 64: - case 32: - { - register unsigned long data,*p; - - p = (unsigned long *) dest; - - for (i = h * w / 32; --i >= 0;) { - data = *p; - *p++ = (data << 24) + (data >> 24) - + (0xFF00 & (data >> 8)) - + (0xFF0000 & (data << 8)); - } - if (wordsize == 64) { - - p = (unsigned long *) dest; - - for (i = h * w / 64; --i >= 0;) { - data = *p++; - p[-1] = p[0]; - *p++ = data; - } - } - break; - } - default: - Abort("xiFill: unknown format"); - } - } - -} - -#define ALLONES 0xFF - -static void -fillrun(char *p, /* address of this scan line */ - pel x0, pel x1, /* left and right X */ - int bit) /* format: LSBFirst or MSBFirst */ -{ - register int startmask,endmask; /* bits to set in first and last char*/ - register int middle; /* number of chars between start and end + 1 */ - - if (x1 <= x0) - return; - middle = x1/8 - x0/8; - p += x0/8; - x0 &= 7; x1 &= 7; - if (bit == LSBFirst) { - startmask = ALLONES << x0; - endmask = ~(ALLONES << x1); - } - else { - startmask = ALLONES >> x0; - endmask = ~(ALLONES >> x1); - } - if (middle == 0) - *p++ |= startmask & endmask; - else { - *p++ |= startmask; - while (--middle > 0) - *p++ = (char)ALLONES; - *p |= endmask; - } -} - -#define CAPABILITIES (CAP_MATRIX | CAP_CHARSUBSETTING) - -#if XFONT_CID -FontRendererRec CIDRendererInfo[] = { - { ".cid", 4, NULL, CIDOpenScalable, - NULL, CIDGetInfoScalable, 0, CAPABILITIES } -}; -#endif - -#if XFONT_CID -FontRendererRec Type1RendererInfo[] = { -#else -static FontRendererRec renderers[] = { -#endif - { ".pfa", 4, NULL, Type1OpenScalable, - NULL, Type1GetInfoScalable, 0, CAPABILITIES }, - { ".pfb", 4, NULL, Type1OpenScalable, - NULL, Type1GetInfoScalable, 0, CAPABILITIES } -}; - -#if XFONT_CID -void -CIDRegisterFontFileFunctions(void) -{ - int i; - - Type1InitStdProps(); - for (i=0; i < sizeof(CIDRendererInfo) / sizeof(FontRendererRec); i++) - FontFileRegisterRenderer(&CIDRendererInfo[i]); -} -#endif - -void -Type1RegisterFontFileFunctions(void) -{ - int i; - -#if XFONT_CID - Type1InitStdProps(); - for (i=0; i < sizeof(Type1RendererInfo) / sizeof(FontRendererRec); i++) - FontFilePriorityRegisterRenderer(&Type1RendererInfo[i], -10); -#else - T1InitStdProps(); - for (i=0; i < sizeof(renderers) / sizeof(FontRendererRec); i++) - FontFilePriorityRegisterRenderer(&renderers[i], -10); -#endif -} - -int -Type1ReturnCodeToXReturnCode(int rc) -{ - switch(rc) { - case SCAN_OK: - return Successful; - case SCAN_FILE_EOF: - /* fall through to BadFontFormat */ - case SCAN_ERROR: - return BadFontFormat; - case SCAN_OUT_OF_MEMORY: - return AllocError; - case SCAN_FILE_OPEN_ERROR: - return BadFontName; - case SCAN_TRUE: - case SCAN_FALSE: - case SCAN_END: - /* fall through */ - default: - /* this should not happen */ -#if XFONT_CID - ErrorF("Font return code cannot be converted to X return code: %d\n", rc); -#else - ErrorF("Type1 return code not convertable to X return code: %d\n", rc); -#endif - return rc; - } -} - -#if XFONT_CID -CharInfoPtr -CIDRenderGlyph(FontPtr pFont, psobj *charstringP, psobj *subarrayP, - struct blues_struct *bluesP, CharInfoPtr pci, int *mode) -{ - int bit, - byte, - glyph, - scan, - image; - int pad,wordsize; /* scan & image in bits */ - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - struct region *area; - CharInfoRec *glyphs; - int len, rc; - long x0; - double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - long h,w; - long paddedW; - cidglyphs *cid; - fsBitmapFormat format = 0; - fsBitmapFormatMask fmask = 0; - - cid = (cidglyphs *)pFont->fontPrivate; - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) { - *mode = rc; - return(NULL); - } - - pad = glyph * 8; - wordsize = scan * 8; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - /* heuristic for "maximum" size of pool we'll need: */ - size = 200000 + 600 * - (int)hypot(cid->pixel_matrix[2], cid->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - *mode = AllocError; - return(NULL); - } - - addmemory(pool, size); - - if (pci && (long)pci->bits == CID_BITMAP_UNDEFINED) - glyphs = pci; - else { - if (!(glyphs = (CharInfoRec *)xalloc(sizeof(CharInfoRec)))) { - delmemory(); - xfree(pool); - *mode = AllocError; - return(NULL); - } - bzero(glyphs, sizeof(CharInfoRec)); - } - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - cid->pixel_matrix[0], - -cid->pixel_matrix[1], - cid->pixel_matrix[2], - -cid->pixel_matrix[3])); - - /* multiplier for computation of raw values */ - sxmult = hypot(cid->pixel_matrix[0], cid->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - rc = 0; - area = (struct region *)CIDfontfcnC(S, charstringP, subarrayP, bluesP, - &len, &rc); - if (rc < 0 || area == NULL) { - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = Type1ReturnCodeToXReturnCode(rc); - return(NULL); - } - - h = area->ymax - area->ymin; - w = area->xmax - area->xmin; - paddedW = PAD(w, pad); - - if (h > 0 && w > 0) { - size = h * paddedW / 8; - glyphs[0].bits = (char *)xalloc(size); - if (glyphs[0].bits == NULL) { - Destroy(area); - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = AllocError; - return(NULL); - } - bzero(glyphs[0].bits, size); - } - else { - size = 0; - h = w = 0; - area->xmin = area->xmax = 0; - area->ymax = area->ymax = 0; - glyphs[0].bits = NULL; - } - - glyphs[0].metrics.leftSideBearing = area->xmin; - x1 = (double)(x0 = area->ending.x - area->origin.x); - y1 = (double)(area->ending.y - area->origin.y); - glyphs[0].metrics.characterWidth = - (x0 + (x0 > 0 ? FPHALF : -FPHALF)) / (1 << FRACTBITS); - if (!glyphs[0].metrics.characterWidth && size == 0) - { - /* Zero size and zero extents: presumably caused by - the choice of transformation. Let's create a - small bitmap so we're not mistaken for an undefined - character. */ - h = w = 1; - size = paddedW = PAD(w, pad); - glyphs[0].bits = (char *)xalloc(size); - if (glyphs[0].bits == NULL) { - Destroy(area); - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = AllocError; - return(NULL); - } - bzero(glyphs[0].bits, size); - } - glyphs[0].metrics.attributes = - NEARESTPEL((long)(hypot(x1, y1) * sxmult)); - glyphs[0].metrics.rightSideBearing = w + area->xmin; - glyphs[0].metrics.descent = area->ymax - NEARESTPEL(area->origin.y); - glyphs[0].metrics.ascent = h - glyphs[0].metrics.descent; - - if (h > 0 && w > 0) - fill(glyphs[0].bits, h, paddedW, area, byte, bit, wordsize); - Destroy(area); - delmemory(); - xfree(pool); - *mode = Successful; - return(glyphs); -} -#endif diff --git a/nx-X11/lib/font/Type1/t1hdigit.h b/nx-X11/lib/font/Type1/t1hdigit.h deleted file mode 100644 index e05f0de5d..000000000 --- a/nx-X11/lib/font/Type1/t1hdigit.h +++ /dev/null @@ -1,40 +0,0 @@ -/* $Xorg: t1hdigit.h,v 1.3 2000/08/17 19:46:33 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* Indicators for special characters in the p_hdigit.h tables */ -#define HERROR (0xfe) -#define HWHITE_SPACE (0xfd) -#define HRIGHT_ANGLE (0xfc) -#define LAST_HDIGIT (0xf0) - -/* Declarations for the tables */ -#define HighHexP (HighHex+1) -extern unsigned char HighHex[]; -#define LowHexP (LowHex+1) -extern unsigned char LowHex[]; diff --git a/nx-X11/lib/font/Type1/t1imager.h b/nx-X11/lib/font/Type1/t1imager.h deleted file mode 100644 index 9730f9a47..000000000 --- a/nx-X11/lib/font/Type1/t1imager.h +++ /dev/null @@ -1,84 +0,0 @@ -/* $Xorg: t1imager.h,v 1.3 2000/08/17 19:46:33 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/t1imager.h,v 1.4 2001/01/17 19:43:23 dawes Exp $ */ - - -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" - -typedef struct xobject *xobject; -typedef struct segment *path; -typedef struct region *region; -typedef struct XYspace *XYspace; - - -#ifndef NULL -#include -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - - -#define WINDINGRULE -2 -#define EVENODDRULE -3 - -#define CONTINUITY 0x80 /* can be added to above rules; e.g. WINDINGRULE+CONTINUITY */ - - -/* -Generic null object definition: -*/ -#define NULLOBJECT ((xobject)NULL) - -/* -Null path definition: -*/ -#define NULLPATH NULLOBJECT - -/* -Full page and null region definition: -*/ -#define INFINITY t1_Infinity -#ifndef NOEXTERNS -extern region *INFINITY; -#endif -#define NULLREGION NULLOBJECT - -#define FF_PARSE_ERROR 5 -#define FF_PATH 1 - diff --git a/nx-X11/lib/font/Type1/t1info.c b/nx-X11/lib/font/Type1/t1info.c deleted file mode 100644 index 322572ee2..000000000 --- a/nx-X11/lib/font/Type1/t1info.c +++ /dev/null @@ -1,1096 +0,0 @@ -/* $Xorg: t1info.c,v 1.4 2001/02/09 02:04:01 xorgcvs Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License, subject to the license given below, to use, - * copy, modify, and distribute this software * and its - * documentation for any purpose and without fee is hereby - * granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software - * without specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Author: Carol H. Thompson IBM Almaden Research Center - * Modeled on spinfo.c by Dave Lemke, Network Computing Devices, Inc - * which contains the following copyright and permission notices: - * - * Copyright 1990, 1991 Network Computing Devices; - * Portions Copyright 1987 by Digital Equipment Corporation - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the names of Network Computing Devices or Digital - * not be used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. Network Computing - * Devices and Digital make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - * - * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES OR DIGITAL BE - * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* - -Copyright 1987, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -*/ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/t1info.c,v 1.18tsi Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#include -#include -#ifndef FONTMODULE -#include -#ifndef BUILDCID -#include -#endif -#else -#include "xf86_ansic.h" -#endif -#include - -#if XFONT_CID -#ifndef FONTMODULE -#ifdef _XOPEN_SOURCE -#include -#else -#define _XOPEN_SOURCE -#include -#undef _XOPEN_SOURCE -#endif -#endif -#include "objects.h" -#include "spaces.h" -#include "range.h" -#endif - -#if XFONT_CID -#include "util.h" -#include "fontfcn.h" - -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) -#ifndef DEFAULT_CFM_DIR -#define DEFAULT_CFM_DIR "./" -#endif -char cfmDefaultDir[] = DEFAULT_CFM_DIR; -#define CFMMAGIC 0x91239123 -#endif -#endif -#include "t1intf.h" - -#define DECIPOINTSPERINCH 722.7 -#define DEFAULTRES 75 -#define DEFAULTPOINTSIZE 120 - -enum scaleType { - atom, truncate_atom, pixel_size, point_size, resolution_x, - resolution_y, average_width -}; - -#if XFONT_CID -extern cidfont *CIDFontP; -static int stdpropsinit = 0; - -typedef struct cfm_rec { - xCharInfo maxbounds; - xCharInfo minbounds; - xCharInfo ink_maxbounds; - xCharInfo ink_minbounds; - INT32 totalrw; - INT16 maxo; - INT16 alle; -} cfmrec; -#endif - -typedef struct _fontProp { - char *name; - long atom; - enum scaleType type; -} fontProp; - -static fontProp fontNamePropTable[] = { /* Example: */ - { "FOUNDRY", 0, atom }, /* adobe */ - { "FAMILY_NAME", 0, atom }, /* times roman */ - { "WEIGHT_NAME", 0, atom }, /* bold */ - { "SLANT", 0, atom }, /* i */ - { "SETWIDTH_NAME", 0, atom }, /* normal */ - { "ADD_STYLE_NAME", 0, atom }, /* */ - { "PIXEL_SIZE", 0, pixel_size }, /* 18 */ - { "POINT_SIZE", 0, point_size }, /* 180 */ - { "RESOLUTION_X", 0, resolution_x }, /* 72 */ - { "RESOLUTION_Y", 0, resolution_y }, /* 72 */ - { "SPACING", 0, atom }, /* p */ - { "AVERAGE_WIDTH", 0, average_width }, /* 0 */ - { "CHARSET_REGISTRY", 0, atom }, /* ISO8859 */ - { "CHARSET_ENCODING", 0, truncate_atom } /* 1 */ -}; - -/* NOTICE: Following array is closely related to the sequence of defines - following it. */ -static fontProp extraProps[] = { - { "FONT", 0, }, - { "COPYRIGHT", 0, }, - { "RAW_PIXEL_SIZE", 0, }, - { "RAW_POINT_SIZE", 0, }, - { "RAW_ASCENT", 0, }, - { "RAW_DESCENT", 0, }, - { "RAW_AVERAGE_WIDTH", 0, }, - { "FACE_NAME", 0, }, - { "FONT_TYPE", 0, }, - { "RASTERIZER_NAME", 0, } -}; - -/* this is a bit kludgy */ -#define FONTPROP 0 -#define COPYRIGHTPROP 1 -#define RAWPIXELPROP 2 -#define RAWPOINTPROP 3 -#define RAWASCENTPROP 4 -#define RAWDESCENTPROP 5 -#define RAWWIDTHPROP 6 -#define FACE_NAMEPROP 7 -#define FONT_TYPEPROP 8 -#define RASTERIZER_NAMEPROP 9 - -#define NNAMEPROPS (sizeof(fontNamePropTable) / sizeof(fontProp)) -#define NEXTRAPROPS (sizeof(extraProps) / sizeof(fontProp)) - -#define NPROPS (NNAMEPROPS + NEXTRAPROPS) - -/*ARGSUSED*/ -static void -FillHeader(FontInfoPtr pInfo, FontScalablePtr Vals) -{ - /* OpenScalable in T1FUNCS sets the following: - pInfo->firstCol, - pInfo->firstRow, - pInfo->lastCol, and - pInfo->lastRow. */ - /* the following are ununsed - pInfo->pad. */ - - /* Items we should handle better someday +++ */ - pInfo->defaultCh = 0; - pInfo->drawDirection = LeftToRight; - if (Vals->point_matrix[0] == Vals->point_matrix[3]) - pInfo->anamorphic = 0; - else - pInfo->anamorphic = 1; - pInfo->inkMetrics = 0; /* no ink metrics here */ - pInfo->cachable = 1; /* no licensing (yet) */ -} - -static void -adjust_min_max(xCharInfo *minc, xCharInfo *maxc, xCharInfo *tmp) -{ -#define MINMAX(field,ci) \ - if (minc->field > (ci)->field) \ - minc->field = (ci)->field; \ - if (maxc->field < (ci)->field) \ - maxc->field = (ci)->field; - - MINMAX(ascent, tmp); - MINMAX(descent, tmp); - MINMAX(leftSideBearing, tmp); - MINMAX(rightSideBearing, tmp); - MINMAX(characterWidth, tmp); - - /* Do MINMAX for attributes field. Since that field is CARD16, - we'll cast to a signed integer */ - if ((INT16)minc->attributes > (INT16)tmp->attributes) - minc->attributes = tmp->attributes; - if ((INT16)maxc->attributes < (INT16)tmp->attributes) - maxc->attributes = tmp->attributes; - -#undef MINMAX -} - -static void -ComputeBounds(FontInfoPtr pInfo, CharInfoPtr pChars, FontScalablePtr Vals) -{ - int i; - xCharInfo minchar, maxchar; - int numchars = 0; - int totchars; - int overlap; - int maxlap; - - minchar.ascent = minchar.descent = - minchar.leftSideBearing = minchar.rightSideBearing = - minchar.characterWidth = minchar.attributes = 32767; - maxchar.ascent = maxchar.descent = - maxchar.leftSideBearing = maxchar.rightSideBearing = - maxchar.characterWidth = maxchar.attributes = -32767; - - maxlap = -32767; - totchars = pInfo->lastCol - pInfo->firstCol + 1; - pChars += pInfo->firstCol; - pInfo->allExist = 1; - for (i = 0; i < totchars; i++,pChars++) { - xCharInfo *pmetrics = &pChars->metrics; - - if (pmetrics->attributes || - pmetrics->ascent != -pmetrics->descent || - pmetrics->leftSideBearing != pmetrics->rightSideBearing) { - numchars++; - adjust_min_max(&minchar, &maxchar, pmetrics); - overlap = pmetrics->rightSideBearing - pmetrics->characterWidth; - if (overlap > maxlap) maxlap = overlap; - } - else pInfo->allExist = 0; - } - - /* If we're monospaced, round the average width field to the - nearest pixel */ - if (minchar.characterWidth == maxchar.characterWidth) - Vals->width = minchar.characterWidth * 10; - - pInfo->maxbounds = maxchar; - pInfo->minbounds = minchar; - pInfo->ink_maxbounds = maxchar; - pInfo->ink_minbounds = minchar; - pInfo->maxOverlap = maxlap + -(minchar.leftSideBearing); - - /* Set the pInfo flags */ - /* Properties set by FontComputeInfoAccelerators: - pInfo->noOverlap; - pInfo->terminalFont; - pInfo->constantMetrics; - pInfo->constantWidth; - pInfo->inkInside; - - */ - FontComputeInfoAccelerators (pInfo); -} - -#if XFONT_CID -#ifdef CID_ALL_CHARS -void -ComputeBoundsAllChars(FontPtr pFont, char *cfmfilename, double sxmult) -{ - FILE *cfm; - CARD32 magic; - int count = 0; - int maxlap, overlap, i, j, k, ret; - xCharInfo minchar, maxchar; - cidrange *cidrangeP; - unsigned char ccode[2]; - unsigned long ccount; - xCharInfo *pmetrics; - long total_raw_width = 0, total_width = 0; - char cfmd[CID_PATH_MAX]; - cfmrec *cfmp; - char *p; - - if (!(cfm = fopen(cfmfilename, "w"))) { - fprintf(stderr, - "Unable to open the file %s. You are probably not logged in as root.\n", - cfmfilename); - p = strrchr(cfmfilename, '/'); - if (p == NULL) exit(1); - strcpy(cfmd, cfmDefaultDir); - strcat(cfmd, p + 1); - if (!(cfm = fopen(cfmd, "w"))) { - fprintf(stderr, - "Switching to current directory. Unable to open the file %s.\n", - cfmd); - exit(1); - } - } - - if ((cfmp = (cfmrec *)xalloc(sizeof(cfmrec))) == NULL) { - fprintf(stderr, "Unable to allocate memory."); - exit(1); - } - bzero(cfmp, sizeof(cfmrec)); - - minchar.ascent = minchar.descent = - minchar.leftSideBearing = minchar.rightSideBearing = - minchar.characterWidth = minchar.attributes = 32767; - maxchar.ascent = maxchar.descent = - maxchar.leftSideBearing = maxchar.rightSideBearing = - maxchar.characterWidth = maxchar.attributes = -32767; - - maxlap = -32767; - cfmp->alle = 1; - cidrangeP = CIDFontP->cidrangeP; - - /* go through all character codes specified in a given CMap */ - for (i = 0; i < CIDFontP->cidrangecnt; i++) { - for (j = 0; j < cidrangeP->rangecnt; j++) { - for (k = cidrangeP->range[j].srcCodeLo; - k <= cidrangeP->range[j].srcCodeHi; k++) { - ccode[0] = (k >> 8) & 0xff; - ccode[1] = k & 0xff; - ret = CIDGetMetrics(pFont, 1, ccode, Linear16Bit, &ccount, &pmetrics); - if (ret != Successful || (ret == Successful && pmetrics == NULL)) - continue; - total_width += pmetrics->attributes; - total_raw_width += abs((int)(INT16)pmetrics->attributes); - if (pmetrics->attributes || - pmetrics->ascent != -pmetrics->descent || - pmetrics->leftSideBearing != pmetrics->rightSideBearing) { - count++; - adjust_min_max(&minchar, &maxchar, pmetrics); - overlap = pmetrics->rightSideBearing - pmetrics->characterWidth; - if (overlap > maxlap) maxlap = overlap; - } - else cfmp->alle = 0; - } - } - } - - if (count) - { - total_raw_width = (total_raw_width * 10 + count / 2) / count; - if (total_width < 0) - { - /* Predominant direction is R->L */ - total_raw_width = -total_raw_width; - } - } - - cfmp->totalrw = (INT32)total_raw_width; - - cfmp->maxbounds.leftSideBearing = - floor((double)maxchar.leftSideBearing * sxmult + 0.5); - cfmp->maxbounds.rightSideBearing = - floor((double)maxchar.rightSideBearing * sxmult + 0.5); - cfmp->maxbounds.characterWidth = - floor((double)maxchar.characterWidth * sxmult + 0.5); - cfmp->maxbounds.ascent = - floor((double)maxchar.ascent * sxmult + 0.5); - cfmp->maxbounds.descent = - floor((double)maxchar.descent * sxmult); - cfmp->maxbounds.attributes = maxchar.attributes; - - cfmp->minbounds.leftSideBearing = - floor((double)minchar.leftSideBearing * sxmult + 0.5); - cfmp->minbounds.rightSideBearing = - floor((double)minchar.rightSideBearing * sxmult + 0.5); - cfmp->minbounds.characterWidth = - floor((double)minchar.characterWidth * sxmult + 0.5); - cfmp->minbounds.ascent = - floor((double)minchar.ascent * sxmult + 0.5); - cfmp->minbounds.descent = - floor((double)minchar.descent * sxmult + 0.5); - cfmp->minbounds.attributes = minchar.attributes; - - cfmp->ink_maxbounds.leftSideBearing = - floor((double)maxchar.leftSideBearing * sxmult + 0.5); - cfmp->ink_maxbounds.rightSideBearing = - floor((double)maxchar.rightSideBearing * sxmult + 0.5); - cfmp->ink_maxbounds.characterWidth = - floor((double)maxchar.characterWidth * sxmult + 0.5); - cfmp->ink_maxbounds.ascent = - floor((double)maxchar.ascent * sxmult + 0.5); - cfmp->ink_maxbounds.descent = - floor((double)maxchar.descent * sxmult + 0.5); - cfmp->ink_maxbounds.attributes = maxchar.attributes; - - cfmp->ink_minbounds.leftSideBearing = - floor((double)minchar.leftSideBearing * sxmult + 0.5); - cfmp->ink_minbounds.rightSideBearing = - floor((double)minchar.rightSideBearing * sxmult + 0.5); - cfmp->ink_minbounds.characterWidth = - floor((double)minchar.characterWidth * sxmult + 0.5); - cfmp->ink_minbounds.ascent = - floor((double)minchar.ascent * sxmult + 0.5); - cfmp->ink_minbounds.descent = - floor((double)minchar.descent * sxmult + 0.5); - cfmp->ink_minbounds.attributes = minchar.attributes; - - cfmp->maxo = (INT32)(maxlap + -(minchar.leftSideBearing)); - - magic = CFMMAGIC; - fwrite(&magic, sizeof(CARD32), 1, cfm); - fwrite(cfmp, sizeof(cfmrec), 1, cfm); - xfree(cfmp); - fclose(cfm); -} -#else -static long -ComputeBoundsAll(FontPtr pFont) -{ - int count = 0; - int maxlap, overlap, i, j, k, ret; - xCharInfo minchar, maxchar; - cidrange *cidrangeP; - unsigned char ccode[2]; - unsigned long ccount; - xCharInfo *pmetrics; - CharInfoRec *cinfo[1]; - long total_raw_width = 0, total_width = 0; - FontInfoPtr pInfo = &(pFont->info); - - minchar.ascent = minchar.descent = - minchar.leftSideBearing = minchar.rightSideBearing = - minchar.characterWidth = minchar.attributes = 32767; - maxchar.ascent = maxchar.descent = - maxchar.leftSideBearing = maxchar.rightSideBearing = - maxchar.characterWidth = maxchar.attributes = -32767; - - maxlap = -32767; - pInfo->allExist = 1; - cidrangeP = CIDFontP->cidrangeP; - - /* go through all character codes specified in a given CMap */ - for (i = 0; i < CIDFontP->cidrangecnt; i++) { - for (j = 0; j < cidrangeP->rangecnt; j++) { - for (k = cidrangeP->range[j].srcCodeLo; - k <= cidrangeP->range[j].srcCodeHi; k++) { - ccode[0] = (k >> 8) & 0xff; - ccode[1] = k & 0xff; - ret = CIDGetMetrics(pFont, 1, ccode, Linear16Bit, &ccount, (xCharInfo **)cinfo); - if (ret != Successful || cinfo == NULL) - continue; - pmetrics = &cinfo[0]->metrics; - total_width += pmetrics->attributes; - total_raw_width += abs((int)(INT16)pmetrics->attributes); - if (pmetrics->attributes || - pmetrics->ascent != -pmetrics->descent || - pmetrics->leftSideBearing != pmetrics->rightSideBearing) { - count++; - adjust_min_max(&minchar, &maxchar, pmetrics); - overlap = pmetrics->rightSideBearing - pmetrics->characterWidth; - if (overlap > maxlap) maxlap = overlap; - } - else pInfo->allExist = 0; - } - } - } - - if (count) - { - total_raw_width = (total_raw_width * 10 + count / 2) / count; - if (total_width < 0) - { - /* Predominant direction is R->L */ - total_raw_width = -total_raw_width; - } - } - - pInfo->maxbounds.leftSideBearing = maxchar.leftSideBearing; - pInfo->maxbounds.rightSideBearing = maxchar.rightSideBearing; - pInfo->maxbounds.characterWidth = maxchar.characterWidth; - pInfo->maxbounds.ascent = maxchar.ascent; - pInfo->maxbounds.descent = maxchar.descent; - pInfo->maxbounds.attributes = maxchar.attributes; - - pInfo->minbounds.leftSideBearing = minchar.leftSideBearing; - pInfo->minbounds.rightSideBearing = minchar.rightSideBearing; - pInfo->minbounds.characterWidth = minchar.characterWidth; - pInfo->minbounds.ascent = minchar.ascent; - pInfo->minbounds.descent = minchar.descent; - pInfo->minbounds.attributes = minchar.attributes; - - pInfo->ink_maxbounds.leftSideBearing = maxchar.leftSideBearing; - pInfo->ink_maxbounds.rightSideBearing = maxchar.rightSideBearing; - pInfo->ink_maxbounds.characterWidth = maxchar.characterWidth; - pInfo->ink_maxbounds.ascent = maxchar.ascent; - pInfo->ink_maxbounds.descent = maxchar.descent; - pInfo->ink_maxbounds.attributes = maxchar.attributes; - - pInfo->ink_minbounds.leftSideBearing = minchar.leftSideBearing; - pInfo->ink_minbounds.rightSideBearing = minchar.rightSideBearing; - pInfo->ink_minbounds.characterWidth = minchar.characterWidth; - pInfo->ink_minbounds.ascent = minchar.ascent; - pInfo->ink_minbounds.descent = minchar.descent; - pInfo->ink_minbounds.attributes = minchar.attributes; - - pInfo->maxOverlap = maxlap + -(minchar.leftSideBearing); - - return total_raw_width; -} -#endif -#endif - -static void -ComputeProps(FontInfoPtr pInfo, FontScalablePtr Vals, char *Filename, - long *sAscent, long *sDescent) -{ - int infoint; - int infoBBox[4]; - int rc; - - QueryFontLib(Filename, "isFixedPitch", &infoint, &rc); - if (!rc) { - pInfo->constantWidth = infoint; - } - QueryFontLib((char *)0, "FontBBox", infoBBox, &rc); - if (!rc) { - pInfo->fontAscent = - (int)((double)infoBBox[3] * Vals->pixel_matrix[3] + - (infoBBox[3] > 0 ? 500 : -500)) / 1000; - pInfo->fontDescent = - -(int)((double)infoBBox[1] * Vals->pixel_matrix[3] + - (infoBBox[1] > 0 ? 500 : -500)) / 1000; - *sAscent = infoBBox[3]; - *sDescent = -infoBBox[1]; - } -} - -#if XFONT_CID -#ifndef CID_ALL_CHARS -static void -CIDComputeStdProps(FontInfoPtr pInfo, FontScalablePtr Vals, - char *Filename, char *Cmapname, char *Fontname, - long sAscent, long sDescent, long sWidth) -{ - FontPropPtr pp; - int i, - nprops; - fontProp *fpt; - char *is_str; - char *ptr1 = NULL, - *ptr2; - char *ptr3; - char *infostrP; - int rc; - char scaledName[CID_PATH_MAX]; - - strcpy (scaledName, Fontname); - /* Fill in our copy of the fontname from the Vals structure */ - FontParseXLFDName (scaledName, Vals, FONT_XLFD_REPLACE_VALUE); - - /* This form of the properties is used by the X-client; the X-server - doesn't care what they are. */ - nprops = pInfo->nprops = NPROPS; - pInfo->isStringProp = (char *) xalloc(sizeof(char) * nprops); - pInfo->props = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops); - if (!pInfo->isStringProp || !pInfo->props) { - xfree(pInfo->isStringProp); - pInfo->isStringProp = (char *) 0; - xfree(pInfo->props); - pInfo->props = (FontPropPtr) 0; - pInfo->nprops = 0; - return; - } - bzero(pInfo->isStringProp, (sizeof(char) * nprops)); - - ptr2 = scaledName; - for (i = NNAMEPROPS, pp = pInfo->props, fpt = fontNamePropTable, is_str = pInfo->isStringProp; - i; - i--, pp++, fpt++, is_str++) { - - if (*ptr2) - { - ptr1 = ptr2 + 1; - if (!(ptr2 = strchr(ptr1, '-'))) ptr2 = strchr(ptr1, '\0'); - } - - pp->name = fpt->atom; - switch (fpt->type) { - case atom: /* Just copy info from scaledName */ - *is_str = TRUE; - pp->value = MakeAtom(ptr1, ptr2 - ptr1, TRUE); - break; - case truncate_atom: - *is_str = TRUE; - for (ptr3 = ptr1; *ptr3; ptr3++) - if (*ptr3 == '[') - break; - pp->value = MakeAtom(ptr1, ptr3 - ptr1, TRUE); - break; - case pixel_size: - pp->value = (int)(fabs(Vals->pixel_matrix[3]) + .5); - break; - case point_size: - pp->value = (int)(fabs(Vals->point_matrix[3]) * 10.0 + .5); - break; - case resolution_x: - pp->value = Vals->x; - break; - case resolution_y: - pp->value = Vals->y; - break; - case average_width: - pp->value = Vals->width; - break; - } - } - - for (i = 0, fpt = extraProps; - i < NEXTRAPROPS; - i++, is_str++, pp++, fpt++) { - pp->name = fpt->atom; - switch (i) { - case FONTPROP: - *is_str = TRUE; - pp->value = MakeAtom(scaledName, strlen(scaledName), TRUE); - break; - case COPYRIGHTPROP: - *is_str = TRUE; - CIDQueryFontLib(Filename, Cmapname, "Notice", &infostrP, &rc); - if (rc || !infostrP) { - infostrP = "Copyright Notice not available"; - } - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case FACE_NAMEPROP: - *is_str = TRUE; - CIDQueryFontLib(Filename, Cmapname, "CIDFontName", &infostrP, &rc); - if (rc || !infostrP) { - infostrP = "(unknown)"; - } - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case FONT_TYPEPROP: - *is_str = TRUE; - infostrP = "CIDFont"; - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case RASTERIZER_NAMEPROP: - *is_str = TRUE; - infostrP = "X Consortium Type 1 Rasterizer"; - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case RAWPIXELPROP: - *is_str = FALSE; - pp->value = 1000; - break; - case RAWPOINTPROP: - *is_str = FALSE; - pp->value = (long)(72270.0 / (double)Vals->y + .5); - break; - case RAWASCENTPROP: - *is_str = FALSE; - pp->value = sAscent; - break; - case RAWDESCENTPROP: - *is_str = FALSE; - pp->value = sDescent; - break; - case RAWWIDTHPROP: - *is_str = FALSE; - pp->value = sWidth; - break; - } - } -} -#endif -#endif - -static void -ComputeStdProps(FontInfoPtr pInfo, FontScalablePtr Vals, - char *Filename, char *Fontname, - long sAscent, long sDescent, long sWidth) -{ - FontPropPtr pp; - int i, - nprops; - fontProp *fpt; - char *is_str; - char *ptr1 = NULL, - *ptr2; - char *ptr3; - char *infostrP; - int rc; - char scaledName[MAXFONTNAMELEN]; - - strcpy (scaledName, Fontname); - /* Fill in our copy of the fontname from the Vals structure */ - FontParseXLFDName (scaledName, Vals, FONT_XLFD_REPLACE_VALUE); - - /* This form of the properties is used by the X-client; the X-server - doesn't care what they are. */ - nprops = pInfo->nprops = NPROPS; - pInfo->isStringProp = (char *) xalloc(sizeof(char) * nprops); - pInfo->props = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops); - if (!pInfo->isStringProp || !pInfo->props) { - xfree(pInfo->isStringProp); - pInfo->isStringProp = (char *) 0; - xfree(pInfo->props); - pInfo->props = (FontPropPtr) 0; - return; - } - bzero(pInfo->isStringProp, (sizeof(char) * nprops)); - - ptr2 = scaledName; - for (i = NNAMEPROPS, pp = pInfo->props, fpt = fontNamePropTable, is_str = pInfo->isStringProp; - i; - i--, pp++, fpt++, is_str++) { - - if (*ptr2) - { - ptr1 = ptr2 + 1; - if (!(ptr2 = strchr(ptr1, '-'))) ptr2 = strchr(ptr1, '\0'); - } - - pp->name = fpt->atom; - switch (fpt->type) { - case atom: /* Just copy info from scaledName */ - *is_str = TRUE; - pp->value = MakeAtom(ptr1, ptr2 - ptr1, TRUE); - break; - case truncate_atom: - *is_str = TRUE; - for (ptr3 = ptr1; *ptr3; ptr3++) - if (*ptr3 == '[') - break; - pp->value = MakeAtom(ptr1, ptr3 - ptr1, TRUE); - break; - case pixel_size: - pp->value = (int)(fabs(Vals->pixel_matrix[3]) + .5); - break; - case point_size: - pp->value = (int)(fabs(Vals->point_matrix[3]) * 10.0 + .5); - break; - case resolution_x: - pp->value = Vals->x; - break; - case resolution_y: - pp->value = Vals->y; - break; - case average_width: - pp->value = Vals->width; - break; - } - } - - for (i = 0, fpt = extraProps; - i < NEXTRAPROPS; - i++, is_str++, pp++, fpt++) { - pp->name = fpt->atom; - switch (i) { - case FONTPROP: - *is_str = TRUE; - pp->value = MakeAtom(scaledName, strlen(scaledName), TRUE); - break; - case COPYRIGHTPROP: - *is_str = TRUE; - QueryFontLib(Filename, "Notice", &infostrP, &rc); - if (rc || !infostrP) { - infostrP = "Copyright Notice not available"; - } - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case FACE_NAMEPROP: - *is_str = TRUE; - QueryFontLib(Filename, "FontName", &infostrP, &rc); - if (rc || !infostrP) { - infostrP = "(unknown)"; - } - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case FONT_TYPEPROP: - *is_str = TRUE; - infostrP = "Type 1"; - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case RASTERIZER_NAMEPROP: - *is_str = TRUE; - infostrP = "X Consortium Type 1 Rasterizer"; - pp->value = MakeAtom(infostrP, strlen(infostrP), TRUE); - break; - case RAWPIXELPROP: - *is_str = FALSE; - pp->value = 1000; - break; - case RAWPOINTPROP: - *is_str = FALSE; - pp->value = (long)(72270.0 / (double)Vals->y + .5); - break; - case RAWASCENTPROP: - *is_str = FALSE; - pp->value = sAscent; - break; - case RAWDESCENTPROP: - *is_str = FALSE; - pp->value = sDescent; - break; - case RAWWIDTHPROP: - *is_str = FALSE; - pp->value = sWidth; - break; - } - } -} - -#if XFONT_CID -/*ARGSUSED*/ -int -CIDGetInfoScalable(FontPathElementPtr fpe, - FontInfoPtr pInfo, - FontEntryPtr entry, - FontNamePtr fontName, - char *fileName, - FontScalablePtr Vals) -{ - FontPtr pfont; - int flags = 0; - long format = 0; /* It doesn't matter what format for just info */ - long fmask = 0; - int ret; - - ret = CIDOpenScalable(fpe, &pfont, flags, entry, fileName, Vals, - format, fmask, NULL); - if (ret != Successful) - return ret; - *pInfo = pfont->info; - - /* XXX - Set pointers in pfont->info to NULL so they are not freed. */ - pfont->info.props = NULL; - pfont->info.isStringProp = NULL; - - CIDCloseFont(pfont); - return Successful; -} -#endif - -/*ARGSUSED*/ -int -Type1GetInfoScalable(FontPathElementPtr fpe, - FontInfoPtr pInfo, - FontEntryPtr entry, - FontNamePtr fontName, - char *fileName, - FontScalablePtr Vals) -{ - FontPtr pfont; - int flags = 0; - long format = 0; /* It doesn't matter what format for just info */ - long fmask = 0; - int ret; - - ret = Type1OpenScalable(fpe, &pfont, flags, entry, fileName, Vals, - format, fmask , NULL); - if (ret != Successful) - return ret; - *pInfo = pfont->info; - - /* XXX - Set pointers in pfont->info to NULL so they are not freed. */ - pfont->info.props = NULL; - pfont->info.isStringProp = NULL; - - Type1CloseFont(pfont); - return Successful; -} - -#if XFONT_CID -#ifndef CID_ALL_CHARS -void -CIDFillFontInfo(FontPtr pFont, FontScalablePtr Vals, - char *Filename, char *Fontname, char *Cmapname, -#ifdef HAVE_CFM - char *cfmfilename, -#endif - long sAscent, long sDescent, double sxmult) -{ -#ifdef HAVE_CFM - FILE *cfm; - cfmrec *cfmp; - int gotcfm = 0; - CARD32 magic; -#endif - long sWidth = 0; - FontInfoPtr pInfo = &pFont->info; - - FillHeader(pInfo, Vals); - -#ifdef HAVE_CFM - if ((cfm = fopen(cfmfilename,"r"))) { - fread(&magic,sizeof(CARD32),1,cfm); - if(magic == CFMMAGIC) { - if ((cfmp = (cfmrec *)xalloc(sizeof(cfmrec))) != NULL) { - fread(cfmp,sizeof(cfmrec),1,cfm); - sWidth = (long)cfmp->totalrw; - pInfo->allExist = cfmp->alle; - if (sxmult != 0) { - pInfo->maxbounds.leftSideBearing = - floor((double)cfmp->maxbounds.leftSideBearing / - sxmult + 0.5); - pInfo->maxbounds.rightSideBearing = - floor((double)cfmp->maxbounds.rightSideBearing / - sxmult + 0.5); - pInfo->maxbounds.characterWidth = - floor((double)cfmp->maxbounds.characterWidth / - sxmult + 0.5); - pInfo->maxbounds.ascent = - floor((double)cfmp->maxbounds.ascent / - sxmult + 0.5); - pInfo->maxbounds.descent = - floor((double)cfmp->maxbounds.descent / - sxmult + 0.5); - pInfo->maxbounds.attributes = - cfmp->maxbounds.attributes; - - pInfo->minbounds.leftSideBearing = - cfmp->minbounds.leftSideBearing / sxmult; - pInfo->minbounds.rightSideBearing = - cfmp->minbounds.rightSideBearing / sxmult; - pInfo->minbounds.characterWidth = - cfmp->minbounds.characterWidth / sxmult; - pInfo->minbounds.ascent = - cfmp->minbounds.ascent / sxmult; - pInfo->minbounds.descent = - cfmp->minbounds.descent / sxmult; - pInfo->minbounds.attributes = cfmp->minbounds.attributes; - - pInfo->ink_maxbounds.leftSideBearing = - cfmp->ink_maxbounds.leftSideBearing / sxmult; - pInfo->ink_maxbounds.rightSideBearing = - cfmp->ink_maxbounds.rightSideBearing / sxmult; - pInfo->ink_maxbounds.characterWidth = - cfmp->ink_maxbounds.characterWidth / sxmult; - pInfo->ink_maxbounds.ascent = - cfmp->ink_maxbounds.ascent / sxmult; - pInfo->ink_maxbounds.descent = - cfmp->ink_maxbounds.descent / sxmult; - pInfo->ink_maxbounds.attributes = - cfmp->ink_maxbounds.attributes; - - pInfo->ink_minbounds.leftSideBearing = - cfmp->ink_minbounds.leftSideBearing / sxmult; - pInfo->ink_minbounds.rightSideBearing = - cfmp->ink_minbounds.rightSideBearing / sxmult; - pInfo->ink_minbounds.characterWidth = - cfmp->ink_minbounds.characterWidth / sxmult; - pInfo->ink_minbounds.ascent = - cfmp->ink_minbounds.ascent / sxmult; - pInfo->ink_minbounds.descent = - cfmp->ink_minbounds.descent / sxmult; - pInfo->ink_minbounds.attributes = - cfmp->ink_minbounds.attributes; - pInfo->ink_minbounds.attributes = - cfmp->ink_minbounds.attributes; - - pInfo->maxOverlap = (short)cfmp->maxo; - - gotcfm = 1; - } - xfree(cfmp); - } - } - fclose(cfm); - } - - if (!gotcfm) -#endif - sWidth = ComputeBoundsAll(pFont); - - FontComputeInfoAccelerators(pInfo); - - CIDComputeStdProps(pInfo, Vals, Filename, Cmapname, Fontname, sAscent, - sDescent, sWidth); -} -#endif /* CID_ALL_CHARS */ -#endif /* BUILDCID */ - -void -T1FillFontInfo(FontPtr pFont, FontScalablePtr Vals, - char *Filename, char *Fontname, long sWidth) -{ - FontInfoPtr pInfo = &pFont->info; - struct type1font *p = (struct type1font *)pFont->fontPrivate; - long sAscent, sDescent; /* Scalable 1000-pixel values */ - - FillHeader(pInfo, Vals); - - ComputeBounds(pInfo, p->glyphs, Vals); - - ComputeProps(pInfo, Vals, Filename, &sAscent, &sDescent); - ComputeStdProps(pInfo, Vals, Filename, Fontname, sAscent, sDescent, sWidth); -} - -/* Called once, at renderer registration time */ -void -#if XFONT_CID -Type1InitStdProps(void) -#else -T1InitStdProps(void) -#endif -{ - int i; - fontProp *t; - -#if XFONT_CID - if (!stdpropsinit) { - stdpropsinit = 1; - i = sizeof(fontNamePropTable) / sizeof(fontProp); - for (t = fontNamePropTable; i; i--, t++) - t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); - i = sizeof(extraProps) / sizeof(fontProp); - for (t = extraProps; i; i--, t++) - t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); - } -#else - i = sizeof(fontNamePropTable) / sizeof(fontProp); - for (t = fontNamePropTable; i; i--, t++) - t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); - i = sizeof(extraProps) / sizeof(fontProp); - for (t = extraProps; i; i--, t++) - t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), TRUE); -#endif -} diff --git a/nx-X11/lib/font/Type1/t1intf.h b/nx-X11/lib/font/Type1/t1intf.h deleted file mode 100644 index 831acc55d..000000000 --- a/nx-X11/lib/font/Type1/t1intf.h +++ /dev/null @@ -1,143 +0,0 @@ -/* $Xorg: t1intf.h,v 1.3 2000/08/17 19:46:33 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/t1intf.h,v 1.6 2001/01/17 19:43:23 dawes Exp $ */ - -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#if XFONT_CID -#include "AFM.h" -#endif - -struct type1font { - CharInfoPtr pDefault; - CharInfoRec glyphs[256]; -}; - -#if XFONT_CID -typedef struct cid_glyphs { - char *CIDFontName; - char *CMapName; - long dataoffset; - double pixel_matrix[4]; - CharInfoPtr pDefault; - CharInfoRec **glyphs; - FontInfo *AFMinfo; -#ifdef USE_MMAP - unsigned char *CIDdata; - long CIDsize; -#endif -} cidglyphs; -#endif - -/* - * Function prototypes - */ -/* t1funcs.c */ -#if XFONT_CID -extern int CIDOpenScalable ( FontPathElementPtr fpe, FontPtr *ppFont, - int flags, FontEntryPtr entry, char *fileName, - FontScalablePtr vals, fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font ); -#endif -extern int Type1OpenScalable ( FontPathElementPtr fpe, FontPtr *ppFont, - int flags, FontEntryPtr entry, char *fileName, - FontScalablePtr vals, fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font ); -#if XFONT_CID -extern unsigned int getCID ( FontPtr pFont, unsigned int charcode ); -extern int CIDGetGlyphs ( FontPtr pFont, unsigned long count, - unsigned char *chars, FontEncoding charEncoding, - unsigned long *glyphCount, CharInfoPtr *glyphs ); -extern int CIDGetMetrics ( FontPtr pFont, unsigned long count, - unsigned char *chars, FontEncoding charEncoding, - unsigned long *glyphCount, xCharInfo **glyphs ); -extern void CIDCloseFont ( FontPtr pFont ); -#endif -extern void Type1CloseFont ( FontPtr pFont ); -extern int Type1ReturnCodeToXReturnCode ( int rc ); -#if XFONT_CID -extern CharInfoPtr CIDRenderGlyph ( FontPtr pFont, psobj *charstringP, - psobj *subarrayP, - struct blues_struct *bluesP, - CharInfoPtr pci, int *mode ); -#endif - -/* t1info.c */ -#ifdef CID_ALL_CHARS -extern void ComputeBoundsAllChars ( FontPtr pFont, char *cfmfilename, double sxmult ); -#endif -#if XFONT_CID -extern int CIDGetInfoScalable ( FontPathElementPtr fpe, FontInfoPtr pInfo, - FontEntryPtr entry, FontNamePtr fontName, - char *fileName, FontScalablePtr Vals ); -#endif -extern int Type1GetInfoScalable ( FontPathElementPtr fpe, FontInfoPtr pInfo, - FontEntryPtr entry, FontNamePtr fontName, - char *fileName, FontScalablePtr Vals ); -#if XFONT_CID -extern void CIDFillFontInfo ( FontPtr pFont, FontScalablePtr Vals, - char *Filename, char *Fontname, char *Cmapname, -#ifdef HAVE_CFM - char *cfmfilename, -#endif - long sAscent, long sDescent, double sxmult ); -#endif -extern void T1FillFontInfo ( FontPtr pFont, FontScalablePtr Vals, - char *Filename, char *Fontname, long sWidth ); -extern void Type1InitStdProps ( void ); - -/* cidchar.c */ -extern CharInfoPtr CIDGetGlyphInfo ( FontPtr pFont, unsigned int cidcode, - CharInfoPtr pci, int *rc ); -extern int CIDGetAFM ( FontPtr pFont, unsigned long count, - unsigned char *chars, FontEncoding charEncoding, - unsigned long *glyphCount, CharInfoPtr *glyphs, - char *cidafmfile ); diff --git a/nx-X11/lib/font/Type1/t1io.c b/nx-X11/lib/font/Type1/t1io.c deleted file mode 100644 index 42b8bb6be..000000000 --- a/nx-X11/lib/font/Type1/t1io.c +++ /dev/null @@ -1,388 +0,0 @@ -/* $Xorg: t1io.c,v 1.3 2000/08/17 19:46:33 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * Author: Carol H. Thompson IBM Almaden Research Center - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/t1io.c,v 3.8 2001/01/17 19:43:23 dawes Exp $ */ -/******************************************************************* -* I/O package for Type 1 font reading -********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef STATIC -#define STATIC static -#endif - -#ifndef FONTMODULE -#include -#include -#else -#include "Xdefs.h" -#include "Xmd.h" /* INT32 declaration */ -#include "xf86_ansic.h" -#endif -#include "t1stdio.h" -#include "t1hdigit.h" -#ifdef WIN32 -#include -#endif -#include - -/* Constants and variables used in the decryption */ -#define c1 ((unsigned short)52845) -#define c2 ((unsigned short)22719) -static unsigned short r; -static int asc, Decrypt; -static int extrach; -static int haveextrach; - -/* Our single FILE structure and buffer for this package */ -STATIC F_FILE TheFile; -STATIC unsigned char TheBuffer[F_BUFSIZ]; - -/* Our routines */ -static int T1Decrypt ( unsigned char *p, int len ); -static int T1Fill ( F_FILE *f ); - -#if XFONT_CID -void -resetDecrypt(void) -{ - Decrypt = 0; -} -#endif - -/* -------------------------------------------------------------- */ -/*ARGSUSED*/ -F_FILE * -T1Open(char *fn, /* Pointer to filename */ - char *mode) /* Pointer to open mode string */ -{ - F_FILE *of = &TheFile; - int oflags = O_RDONLY; /* We know we are only reading */ - - Decrypt = 0; - -#ifdef O_BINARY /* VMS or DOS */ - oflags |= O_BINARY; -#endif - of->fd = open(fn, oflags, 0); - if (of->fd < 0) - return NULL; - - /* Initialize the buffer information of our file descriptor */ - of->b_base = TheBuffer; - of->b_size = F_BUFSIZ; - of->b_ptr = NULL; - of->b_cnt = 0; - of->flags = 0; - of->error = 0; - haveextrach = 0; - return &TheFile; -} /* end Open */ - -/* -------------------------------------------------------------- */ -int /* Read one character */ -T1Getc(F_FILE *f) /* Stream descriptor */ -{ - if (f->b_base == NULL) return EOF; /* already closed */ - - if (f->flags & UNGOTTENC) { /* there is an ungotten c */ - f->flags &= ~UNGOTTENC; - return (int) f->ungotc; - } - - if (f->b_cnt == 0) /* Buffer needs to be (re)filled */ - f->b_cnt = T1Fill(f); - if (f->b_cnt > 0) return (f->b_cnt--, (int) *(f->b_ptr++)); - else { - f->flags |= FIOEOF; - return EOF; - } -} /* end Getc */ - -/* -------------------------------------------------------------- */ -int /* Put back one character */ -T1Ungetc(int c, - F_FILE *f) /* Stream descriptor */ -{ - if (c != EOF) { - f->ungotc = c; - f->flags |= UNGOTTENC; /* set flag */ - f->flags &= ~FIOEOF; /* reset EOF */ - } - return c; -} /* end Ungetc */ - -/* -------------------------------------------------------------- */ -int /* Read n items into caller's buffer */ -T1Read(char *buffP, /* Buffer to be filled */ - int size, /* Size of each item */ - int n, /* Number of items to read */ - F_FILE *f) /* Stream descriptor */ -{ - int bytelen, cnt, i; - F_char *p = (F_char *)buffP; - int icnt; /* Number of characters to read */ - - if (f->b_base == NULL) return 0; /* closed */ - icnt = (size!=1)?n*size:n; /* Number of bytes we want */ - - if (f->flags & UNGOTTENC) { /* there is an ungotten c */ - f->flags &= ~UNGOTTENC; - *(p++) = f->ungotc; - icnt--; bytelen = 1; - } - else bytelen = 0; - - while (icnt > 0) { - /* First use any bytes we have buffered in the stream buffer */ - if ((cnt=f->b_cnt) > 0) { - if (cnt > icnt) cnt = icnt; - for (i=0; ib_ptr++); - f->b_cnt -= cnt; - icnt -= cnt; - bytelen += cnt; - } - - if ((icnt == 0) || (f->flags & FIOEOF)) break; - - f->b_cnt = T1Fill(f); - } - return ((size!=1)?bytelen/size:bytelen); -} /* end Read */ - -/* -------------------------------------------------------------- */ -int /* Close the file */ -T1Close(F_FILE *f) /* Stream descriptor */ -{ - if (f->b_base == NULL) return 0; /* already closed */ - f->b_base = NULL; /* no valid stream */ - return close(f->fd); -} /* end Close */ - - -/* -------------------------------------------------------------- */ -F_FILE * /* Initialization */ -T1eexec(F_FILE *f) /* Stream descriptor */ -{ - int i, c; - int H; - unsigned char *p; - unsigned char randomP[8]; - - r = 55665; /* initial key */ - asc = 1; /* indicate ASCII form */ - - /* Consume the 4 random bytes, determining if we are also to - ASCIIDecodeHex as we process our input. (See pages 63-64 - of the Adobe Type 1 Font Format book.) */ - - /* Skip over any initial white space chars */ - while (HighHexP[c=_XT1getc(f)] == HWHITE_SPACE) ; - - /* If ASCII, the next 7 chars are guaranteed consecutive */ - randomP[0] = c; /* store first non white space char */ - T1Read((pointer)(randomP+1), 1, 3, f); /* read 3 more, for a total of 4 */ - /* store first four chars */ - for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */ - if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */ - asc = 0; - break; - } - } - if (asc) { /* ASCII form, convert first eight bytes to binary */ - T1Read((pointer)(randomP+4), 1, 4, f); /* Need four more */ - for (i=0,p=randomP; i<4; i++) { /* Convert */ - H = HighHexP[*p++]; - randomP[i] = H | LowHexP[*p++]; - } - } - - /* Adjust our key */ - for (i=0,p=randomP; i<4; i++) { - r = (*p++ + r) * c1 + c2; - } - - /* Decrypt the remaining buffered bytes */ - f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); - Decrypt = 1; - return (T1Feof(f))?NULL:f; -} /* end eexec */ - -#if XFONT_CID -F_FILE * /* Initialization */ -CIDeexec(F_FILE *f) /* Stream descriptor */ -{ - int i, c; - int H; - unsigned char *p; - unsigned char randomP[8]; - - r = 55665; /* initial key */ - asc = 1; /* indicate ASCII form */ - - /* Consume the 4 random bytes, determining if we are also to - ASCIIDecodeHex as we process our input. (See pages 63-64 - of the Adobe Type 1 Font Format book.) */ - - /* Skip over any initial white space chars */ - while (HighHexP[c=_XT1getc(f)] == HWHITE_SPACE) ; - - /* If ASCII, the next 7 chars are guaranteed consecutive */ - randomP[0] = c; /* store first non white space char */ - T1Read((pointer)(randomP+1), 1, 3, f); /* read 3 more, for a total of 4 */ - /* store first four chars */ - for (i=0,p=randomP; i<4; i++) { /* Check 4 valid ASCIIEncode chars */ - if (HighHexP[*p++] > LAST_HDIGIT) { /* non-ASCII byte */ - asc = 0; - break; - } - } - if (asc) { /* ASCII form, convert first eight bytes to binary */ - T1Read((pointer)(randomP+4), 1, 4, f); /* Need four more */ - for (i=0,p=randomP; i<4; i++) { /* Convert */ - H = HighHexP[*p++]; - randomP[i] = H | LowHexP[*p++]; - } - } - - /* Adjust our key */ - for (i=0,p=randomP; i<4; i++) { - r = (*p++ + r) * c1 + c2; - } - - /* Decrypt up to, but not including, the first '%' sign */ - if (f->b_cnt > 0) { - for (i = 0; i < f->b_cnt; i++) - if (*(f->b_ptr + i) == '%') - break; - - if (i < f->b_cnt) { - if (i == 0) - f->b_cnt = 0; - else - f->b_cnt = T1Decrypt(f->b_ptr, i); - } else - f->b_cnt = T1Decrypt(f->b_ptr, f->b_cnt); - } - Decrypt = 1; - return (T1Feof(f))?NULL:f; -} /* end eexec */ -#endif - -/* -------------------------------------------------------------- */ -STATIC int -T1Decrypt(unsigned char *p, int len) -{ - int n; - int H = 0, L; - unsigned char *inp = p; - unsigned char *tblP; - - if (asc) { - if (haveextrach) { - H = extrach; - tblP = LowHexP; - } - else tblP = HighHexP; - for (n=0; len>0; len--) { - L = tblP[*inp++]; - if (L == HWHITE_SPACE) continue; - if (L > LAST_HDIGIT) break; - if (tblP == HighHexP) { /* Got first hexit value */ - H = L; - tblP = LowHexP; - } else { /* Got second hexit value; compute value and store it */ - n++; - tblP = HighHexP; - H |= L; - /* H is an int, 0 <= H <= 255, so all of this will work */ - *p++ = H ^ (r >> 8); - r = (H + r) * c1 + c2; - } - } - if (tblP != HighHexP) { /* We had an odd number of hexits */ - extrach = H; - haveextrach = 1; - } else haveextrach = 0; - return n; - } else { - for (n = len; n>0; n--) { - H = *inp++; - *p++ = H ^ (r >> 8); - r = (H + r) * c1 + c2; - } - return len; - } -} /* end Decrypt */ - -/* -------------------------------------------------------------- */ -STATIC int /* Refill stream buffer */ -T1Fill(F_FILE *f) /* Stream descriptor */ -{ - int rc; - - rc = read(f->fd, f->b_base, F_BUFSIZ); - /* propagate any error or eof to current file */ - if (rc <= 0) { - if (rc == 0) /* means EOF */ - f->flags |= FIOEOF; - else { - f->error = (short)-rc; - f->flags |= FIOERROR; - rc = 0; - } - } - f->b_ptr = f->b_base; - if (Decrypt) rc = T1Decrypt(f->b_base, rc); - return rc; -} /* end Fill */ diff --git a/nx-X11/lib/font/Type1/t1malloc.c b/nx-X11/lib/font/Type1/t1malloc.c deleted file mode 100644 index 20d4212cd..000000000 --- a/nx-X11/lib/font/Type1/t1malloc.c +++ /dev/null @@ -1,759 +0,0 @@ -/* $Xorg: t1malloc.c,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark not be - * used in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * - * IBM AND LEXMARK PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES OF - * ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO ANY - * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, - * AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE - * QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF THE - * SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM OR LEXMARK) ASSUMES THE - * ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN NO EVENT SHALL - * IBM OR LEXMARK 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. - */ -/* $XFree86: xc/lib/font/Type1/t1malloc.c,v 1.11 2002/02/18 20:51:57 herrb Exp $ */ - /* MALLOC CWEB V0004 LOTS */ -/* -:h1.MALLOC - Fast Memory Allocation - -This module is meant to provide portable C-style memory allocation -routines (malloc/free). - -&author. Jeffrey B. Lotspiech (lotspiech@almaden.ibm.com) - -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifndef FONTMODULE -#include -#else -#include "Xdefs.h" /* Bool declaration */ -#include "Xmd.h" /* INT32 declaration */ -#include "os.h" -#include "xf86_ansic.h" -#endif -#include "objects.h" /* get #define for Abort() */ - - -/* -:h3.Define NULL - -In the beginning, C compilers made no assumptions about NULL. It was -even theoretically possible that NULL would not be 0. ANSI has tied -this down a bit. The following definition seems to be the most -popular (in terms of reducing compiler complaints), however, if your -compiler is unhappy about it, you can redefine it on the command line: -*/ -#ifndef NULL -#include -#endif -/* -Of course, NULL is important because xiMalloc() is defined to return -NULL when out of memory. - -:h2.Data Structures Used to Manage Free Memory - -:h3.The "freeblock" Structure - -The list of available memory blocks is a doubly-linked list. Each -block begins with the following structure: -*/ - -struct freeblock { - long size; /* number of 'longs' in block, - including this header */ - struct freeblock *fore; /* forward in doubly-linked list */ - struct freeblock *back; /* backward in doubly-linked list */ -} ; -/* -In addition, each free block has a TRAILER that is simply the 'size' -repeated. Thus 'size' is found at the beginning of the block and at the -end of the block (size-1 longs away). 'size' includes both the header -and the trailer. - -When a block is allocated, its 'size' is turned negative (both at the -beginning and at the end). Thus, checking whether two blocks may be -combined is very simple. We merely examine both neighboring blocks' -size to see if they are positive (and hence available for combination). - -The memory address returned to the user is therefore one "long" below the -size, and one extra "long" is added to the end of the block (beyond what -the user requested) to store the trailing size. - -:h3."firstfree" and "lastfree", the Anchors to the Free List - -"firstfree" points to the first available free block; "lastfree" points -to the end of the chain of available blocks. These are linked together -by initialization code; see :hdref refid=addmem.. -*/ - -static struct freeblock firstfree = { 0L, NULL, NULL }; -static struct freeblock lastfree = { 0L, NULL, NULL }; - -/* -:h3."firstcombined" and "uncombined", Keeping Track of Uncombined Blocks - -This module is designed to make the combining of adjacent free memory -blocks be very fast. Nonetheless, combining blocks is naturally the -most expensive part of any memory system. In an X system, -it is worthwhile to defer the combination for a while, because -frequently we will end up asking for a block of exactly the same -size that we recently returned and we can save ourselves some work. - -"MAXUNCOMBINED" is the maximum number of uncombined blocks that we will -allow at any time: -*/ - -#define MAXUNCOMBINED 3 - -/* -"firstcombined" is a pointer into the free list. The uncombined blocks -are always at the front of the list. "firstcombined" points to the -first block that has been combined. -*/ -static struct freeblock *firstcombined = &lastfree; -static short uncombined = 0; /* current number of uncombined blocks */ - -/* -Uncombined blocks have a negative 'size'; in this they are like -allocated blocks. - -We store a distinctive hex pattern in 'size' when we combine a block -to help us debug: -*/ -#define COMBINED 0xBADBAD - -/* -:h3.DEBUGWORDS - Extra Memory Saved With Each Block for Debug - -We add 'DEBUGWORDS' words to each allocated block to put interesting -debug information: -*/ -#ifndef DEBUGWORDS -#define DEBUGWORDS 0 -#endif - -/* -:h3.MINEXCESS - Amount of "Excess" We Would be Willing to Ignore - -When we search the free list to find memory for a user request, we -frequently find an area that is bigger than what the user has asked for. -Normally we put the remaining words (the excess) back on the free list. -However, if the area is just slightly bigger than what the user needs, -it is counter-productive to do this, as the small amount recovered tends -to hurt by increasing memory fragmentation rather than help by providing -more available memory. "MINEXCESS" is the number of words that must be -recovered before we would bother to put the excess back on the free -list. If there is not enough excess, we just give the user more than he -asked for. -*/ - -#define MINEXCESS (7 + DEBUGWORDS) - -/* -:h3.Some Flags for Debug -*/ - -long AvailableWords = 0; /* number of words available in memory */ -char mallocdebug = 0; /* a flag that enables some chatty printf's */ - -/* -:h3.Prototypes of static functions -*/ - -static void combine ( void ); -static void freeuncombinable ( long *addr, long size ); -static void unhook ( struct freeblock *p ); -static void dumpchain ( void ); -#ifdef notused -static void reportarea ( long *area ); -#endif - -/* -:h3.whocalledme() - Debug for Memory Leaks - -This routine is 68000-specific; it copies the value of the application's -curOper variable (which is often a pointer to a character string), and -the first part of the stack at the time malloc was called into the -DEBUGWORDS area reserved with each block. -We use it to see who is malloc-ing memory without free-ing it. -*/ - -#if DEBUGWORDS - -static void -whocalledme(long *addr, /* address of memory block */ - long *stack) /* address of malloc's parameter on stack */ -{ - register long size; /* size of memory block */ - register int i; /* loop index */ - extern char *curOper; /* ptr to last operator (kept by appl.) */ - - stack--; - size = - *addr; - - addr += size - 1 - DEBUGWORDS; - *addr++ = (long) curOper; - for (i=0; i < DEBUGWORDS-1; i++) - *addr++ = *stack++; -} -#else - -#define whocalledme(addr, stack) - -#endif -/* -:h2.xiFree() - User-Callable "Return Memory" Routine - -The actual beginning of the block is one 'long' before the address we -gave to the user. The block begins and ends with '-size' in words. -*/ - -void -xiFree(long *addr) /* user's memory to be returned */ -{ - register long size; /* amount of memory in this block */ - register struct freeblock *p; /* identical to 'addr' */ - - if (addr == NULL) { /* common "mistake", so allow it (CHT) */ - printf("\nxiFree(NULL)?\n"); - return; - } - - size = *--addr; -/* -Make sure this address looks OK; 'size' must be less than zero (meaning -the block is allocated) and should be repeated at the end of the block. -*/ - if (size >= 0) - Abort("free: bad size"); - if (addr[-1 - size] != size) - Abort("free: mismatched size"); -/* -Now make this a 'freeblock' structure and tack it on the FRONT of the -free list (where uncombined blocks go): -*/ - AvailableWords -= size; /* actually INCREASES AvailableWords */ - p = (struct freeblock *) addr; - p->back = &firstfree; - (p->fore = firstfree.fore)->back = p; - firstfree.fore = p; -/* -If we have too many uncombined blocks, call combine() to combine one. -*/ - if (++uncombined > MAXUNCOMBINED) { - combine(); - if (mallocdebug) { - printf("xiFree(%p) with combine, ", (void *)addr); - dumpchain(); - } - } - else { - if (mallocdebug) { - printf("xiFree(%p), ", (void *)addr); - dumpchain(); - } - } - - return; -} - -/* -:h3.combine() - Subroutine of xiFree() to Combine Blocks - -This routine tries to combine the block just before 'firstcombined'. -In any event, that block will be moved to the end of the list (after -'firstcombined'). -*/ - -static void -combine(void) -{ - register struct freeblock *p; /* block we will try to combine */ - register long *addr; /* identical to 'p' for 'long' access */ - register long size; /* size of this block */ - register long size2; /* size of potential combinee */ - - p = firstcombined->back; - if (p == &firstfree) - Abort("why are we combining?"); - - addr = (long *) p; - size = - p->size; - if (--uncombined < 0) - Abort("too many combine()s"); - - if (addr[-1] < 0 && addr[size] < 0) { -/* -We special case the situation where no combining can be done. Then, we -just mark the chain "combined" (i.e., positive size), move the -'firstcombined' pointer back in the chain, and return. -*/ - addr[0] = addr[size - 1] = size; - firstcombined = (struct freeblock *) addr; - return; - } -/* -Otherwise, we unhook this pointer from the chain: -*/ - unhook(p); -/* -First we attempt to combine this with the block immediately above: -*/ - size2 = addr[-1]; - if (size2 > 0) { /* i.e., block above is free */ - *addr = COMBINED; /* might help debug */ - addr -= size2; - if (addr[0] != size2) - Abort("bad block above"); - unhook((struct freeblock *)addr); - size += size2; - } -/* -At this point 'addr' and 'size' may be the original block, or it may be -the newly combined block. Now we attempt to combine it with the block -below: -*/ - p = (struct freeblock *) (addr + size); - size2 = p->size; - - if (size2 > 0) { /* i.e., block below is free */ - p->size = COMBINED; - if (size2 != ((long *) p)[size2 - 1]) - Abort("bad block below"); - unhook(p); - size += size2; - } -/* -Finally we take the newly combined block and put it on the end of the -chain by calling the "freeuncombinable" subroutine: -*/ - freeuncombinable(addr, size); -} - -/* -:h3.freeuncombinable() - Free a Block That Need Not be Combined - -This block is "uncombinable" either because we have already combined -it with its eligible neighbors, or perhaps because we know it has -no neighbors. -*/ - -static void -freeuncombinable(long *addr, /* address of the block to be freed */ - long size) /* size of block in words */ -{ - register struct freeblock *p; /* a convenient synonym for 'addr' */ - -/* -Mark block allocated and combined by setting its 'size' positive: -*/ - addr[size - 1] = addr[0] = size; -/* -Now tack the block on the end of the doubly-linked free list: -*/ - p = (struct freeblock *) addr; - p->fore = &lastfree; - (p->back = lastfree.back)->fore = p; - lastfree.back = p; -/* -If we have previously had no combined blocks, we must update -'firstcombined' to point to this block: -*/ - if (firstcombined->fore == NULL) - firstcombined = p; -} - -/* -:h3.unhook() - Unhook a Block from the Doubly-linked List - -The only tricky thing here is to make sure that 'firstcombined' is -updated if this block happened to be the old 'firstcombined'. (We -would never be unhooking 'firstfree' or 'lastfree', so we do not -have to worry about the end cases.) -*/ - -static void -unhook(struct freeblock *p) /* block to unhook */ -{ - p->back->fore = p->fore; - p->fore->back = p->back; - - if (firstcombined == p) - firstcombined = p->fore; -} -/* -:h2.xiMalloc() - Main User Entry Point for Getting Memory - -We have two slightly different versions of xiMalloc(). In the case -where we have TYPE1IMAGER and a font cache, we are prepared, when nominally -out of memory, to loop calling TYPE1IMAGER's GimeSpace() to release font -cache. -*/ - -/* The following code put in by MDC on 11/10/90 */ - -#ifdef TYPE1IMAGER - -static char *malloc_local(unsigned size); - -char * -xiMalloc(unsigned size) -{ - char *memaddr; - - while ( (memaddr = malloc_local(size)) == NULL ) { - /* Ask TYPE1IMAGER to give us some of its cache back */ - if ( I_GimeSpace() == 0 ) break; /* We are really, really, out of memory */ - } - - return(memaddr); -} -#endif - -/* -Now begins the real workhorse xiMalloc() (called 'malloc_local' if -we are taking advantage of TYPE1IMAGER). Its argument is an unsigned; -at least that lets users with 16-bit integers get a 64K chunk of -memory, and it is also compatible with the definition of a "size_t" -in most systems. -*/ -#ifdef TYPE1IMAGER -static char * -malloc_local(unsigned Size) /* number of bytes the user requested */ -#else -char * -xiMalloc(unsigned Size) -#endif -{ - register long size = (long)Size; /* a working register for size */ - register struct freeblock *p; /* tentative block to be returned */ - register long excess; /* words in excess of user request */ - register long *area; /* a convenient synonym for 'p' */ - -/* -First, we increase 'size' to allow for the two size fields we will -save with the block, plus any information for debug purposes. -Then we ensure that the block will be large enough to hold our -'freeblock' information. Finally we convert it to be in words -(longs), not bytes, increased to span an integral number of double -words, so that all memory blocks dispensed with be properly aligned. -*/ - size += 2*sizeof(long) + DEBUGWORDS*sizeof(long); - if (size < sizeof(struct freeblock) + sizeof(long)) - size = sizeof(struct freeblock) + sizeof(long); - size = ((unsigned) (size + sizeof(double) - 1) / sizeof(double)) * (sizeof(double)/sizeof(long)); - -/* -For speed, we will try first to give the user back a very recently -returned block--one that is on the front of the chain before -'firstcombined'. These blocks still have negative sizes, and need -only to be "unhook"ed: -*/ - size = -size; - for (p=firstfree.fore; p != firstcombined; p=p->fore) { - if (p->size == size) { - unhook(p); - uncombined--; - if (mallocdebug) { - printf("fast xiMalloc(%ld) = %p, ", size, - (void *)p); - dumpchain(); - } - AvailableWords += size; /* decreases AvailableWords */ - whocalledme(p, &Size); - return((char *)&p->fore); - } - } -/* -Well, if we get here, there are no uncombined blocks matching the user's -request. So, we search the rest of the chain for a block that is big -enough. ('size' becomes positive again): -*/ - size = -size; - for (;; p = p->fore) { -/* -If we hit the end of the chain (p->size == 0), we are probably out of -memory. However, we should first try to combine any memory that has -not yet been combined before we give that pessimistic answer. If -we succeed in combining, we can call ourselves recursively to try to -allocate the requested amount: -*/ - if (p->size == 0) { - if (uncombined <= 0) - return(NULL); - while (firstfree.fore != firstcombined) - combine(); - return(xiMalloc(sizeof(long) * (size - 2 - DEBUGWORDS))); - } -/* -Otherwise, we keep searching until we find a big enough block: -*/ - if (p->size >= size) - break; - } -/* -At this point, 'p' contains a block at least as big as what the user -requested, so we take it off the free chain. If it is excessively big, -we return the excess to the free chain: -*/ - unhook(p); - excess = p->size - size; - area = (long *) p; - - if (excess > MINEXCESS) - freeuncombinable(area + size, excess); - else - size = p->size; - - AvailableWords -= size; -/* -Mark first and last word of block with the negative of the size, to -flag that this block is allocated: -*/ - area[size - 1] = area[0] = - size; - - if (mallocdebug) { - printf("slow xiMalloc(%ld) @ %p, ", size, (void *)area); - dumpchain(); - } - whocalledme(area, &Size); -/* -The address we return to the user is one 'long' BELOW the address of -the block. This protects our 'size' field, so we can tell the size -of the block when he returns it to us with xiFree(). Also, he better not -touch the 'size' field at the end of the block either. (That would be -nasty of him, as he would be touching memory outside of the bytes he -requested). -*/ - return((char *) (area + 1)); -} - -/* -:h2 id=addmem.addmemory() - Initialize Free Memory - -This routine should be called at initialization to initialize the -free chain. There is no standard way to do this in C. -We want the memory dispensed by malloc to be aligned on a double word -boundary (because some machines either require alignment, or are -more efficient if accesses are aligned). Since the total size of -any block created by malloc is an integral number of double words, -all we have to do to ensure alignment is to adjust each large block -added to the free chain to start on an odd long-word boundary. -(Malloc's size field will occupy the odd long and the user's memory -will then begin on an even boundary.) Since we fill in additional -size fields at the beginning and end of each of the large freeblocks, -we need only adjust the address passed to addmemory to a double word -boundary. -*/ - -#define MAXAREAS 10 /* there can be this many calls to addmemory() */ - -static long *freearea[MAXAREAS] = { NULL }; /* so we can report later */ - -void -addmemory(long *addr, /* beginning of free area */ - long size) /* number of bytes of free area */ -{ - register int i; /* loop index variable */ - register long *aaddr; /* aligned beginning of free area */ - -#if DEBUGWORDS - printf("malloc has DEBUGWORDS=%d\n", DEBUGWORDS); -#endif -/* -First link together firstfree and lastfree if necessary: -*/ - if (firstfree.fore == NULL) { - firstfree.fore = &lastfree; - lastfree.back = &firstfree; - } -/* -We'll record where the area was that was given to us for later reports: -*/ - for (i=0; i < MAXAREAS; i++) - if (freearea[i] == NULL) break; - if (i >= MAXAREAS) - Abort("too many addmemory()s"); - aaddr = (long *) ( ((long) addr + sizeof(double) - 1) & - (long)sizeof(double) ); - size -= (char *) aaddr - (char *) addr; - freearea[i] = aaddr; -/* -Convert 'size' to number of longs, and store '-size' guards at the -beginning and end of this area so we will not accidentally recombine the -first or last block: -*/ - size /= sizeof(long); - - AvailableWords += size - 2; - - aaddr[size - 1] = aaddr[0] = -size; -/* -Finally, call 'freeuncombinable' to put the remaining memory on the -free list: -*/ - freeuncombinable(aaddr + 1, size - 2); -} - -/* -:h3.delmemory() - Delete Memory Pool -*/ -void -delmemory(void) -{ - register int i; - - AvailableWords = 0; - firstfree.fore = &lastfree; - lastfree.back = &firstfree; - firstcombined = &lastfree; - uncombined = 0; - for (i=0; ifore) { - if (--i < 0) - Abort("too many uncombined areas"); - size = p->size; - printf(". . . area @ %p, size = %ld\n", (void *)p, -size); - if (size >= 0 || size != ((int *) p)[-1 - size]) - Abort("dumpchain: bad size"); - if (p->back != back) - Abort("dumpchain: bad back"); - back = p; - } - printf("DUMPING COMBINED FREE LIST:\n"); - for (; p != &lastfree; p = p->fore) { - size = p->size; - printf(". . . area @ %p, size = %ld\n", (void *)p, size); - if (size <= 0 || size != ((int *) p)[size - 1]) - Abort("dumpchain: bad size"); - if (p->back != back) - Abort("dumpchain: bad back"); - back = p; - } - if (back != lastfree.back) - Abort("dumpchain: bad lastfree"); -} - -#ifdef notused -/* -:h3.reportarea() - Display a Contiguous Set of Memory Blocks -*/ - -static void -reportarea(long *area) /* start of blocks (from addmemory) */ -{ - register long size; /* size of current block */ - register long wholesize; /* size of original area */ - register struct freeblock *p; /* pointer to block */ - - if (area == NULL) - return; - wholesize = - *area++; - wholesize -= 2; - - while (wholesize > 0) { - size = *area; - if (size < 0) { - register int i,j; - - size = -size; - printf("Allocated %5ld bytes at %p, first words=%08lx %08lx\n", - size * sizeof(long), area + 1, area[1], area[2]); -#if DEBUGWORDS - printf(" ...Last operator: %s\n", - (char *)area[size-DEBUGWORDS-1]); -#endif - for (i = size - DEBUGWORDS; i < size - 2; i += 8) { - printf(" ..."); - for (j=0; j<8; j++) - printf(" %08lx", area[i+j]); - printf("\n"); - } - - } - else { - printf("Free %ld bytes at %p\n", size * sizeof(long), - area); - if (size == 0) - Abort("zero sized memory block"); - - for (p = firstfree.fore; p != NULL; p = p->fore) - if ((long *) p == area) break; - if ((long *) p != area) - Abort("not found on forward chain"); - - for (p = lastfree.back; p != NULL; p = p->back) - if ((long *) p == area) break; - if ((long *) p != area) - Abort("not found on backward chain"); - } - if (area[0] != area[size - 1]) - Abort("unmatched check sizes"); - area += size; - wholesize -= size; - } -} - -/* -:h3.MemReport() - Display All of Memory -*/ - -void -MemReport(void) -{ - register int i; - - dumpchain(); - - for (i=0; i -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "pictures.h" - -/* -:h2.Handle Functions - -:h3.Phantom() - Returns a Move Segment Equivalent to Handles - -This is a user operator. Its new name is QueryHandle. -*/ - -struct segment * -t1_Phantom(struct segment *p) /* object to take the Phantom of */ -{ - struct fractpoint pt; /* handle size will built here */ - - if (p == NULL) - pt.x = pt.y = 0; - else - PathDelta(p, &pt); - - return(PathSegment(MOVETYPE, pt.x, pt.y)); -} - -/* -:h3.Snap() - Force Ending Handle of Object to Origin - -This is a user operator. -*/ - -struct segment * -t1_Snap(struct segment *p) /* path to snap */ -{ - struct fractpoint pt; /* for finding length of path */ - - if (p == NULL) - return(NULL); - p = UniquePath(p); - - PathDelta(p, &pt); - if (p->last->type == MOVETYPE) { - p->last->dest.x -= pt.x; - p->last->dest.y -= pt.y; - } - else - p = JoinSegment(p, MOVETYPE, -pt.x, -pt.y, NULL); - return(p); -} diff --git a/nx-X11/lib/font/Type1/t1stdio.h b/nx-X11/lib/font/Type1/t1stdio.h deleted file mode 100644 index 2ed083253..000000000 --- a/nx-X11/lib/font/Type1/t1stdio.h +++ /dev/null @@ -1,101 +0,0 @@ -/* $Xorg: t1stdio.h,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/t1stdio.h,v 1.9 2001/01/17 19:43:24 dawes Exp $ */ -/* T1IO FILE structure and related stuff */ -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifdef XFree86LOADER -#undef FILE -#endif -#define FILE F_FILE -typedef unsigned char F_char; - -typedef struct F_FILE { - F_char *b_base; /* Pointer to beginning of buffer */ - long b_size; /* Size of the buffer */ - F_char *b_ptr; /* Pointer to next char in buffer */ - long b_cnt; /* Number of chars remaining in buffer */ - F_char flags; /* other flags; != 0 means getc must call fgetc */ - F_char ungotc; /* Place for ungotten char; flag set if present */ - short error; /* error status */ - int fd; /* underlying file descriptor */ -} F_FILE; - - -/* defines for flags */ -#define UNGOTTENC (0x01) -#define FIOEOF (0x80) -#define FIOERROR (0x40) - -#ifndef NULL -#include -#endif - -#define EOF (-1) /* end of file */ -#define F_BUFSIZ (512) - -#define _XT1getc(f) \ - ( \ - ( ((f)->b_cnt > 0) && ((f)->flags == 0) ) ? \ - ( (f)->b_cnt--, (unsigned int)*( (f)->b_ptr++ ) ) : \ - T1Getc(f) \ - ) - -#define T1Feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) - -#if XFONT_CID -extern F_FILE *CIDeexec ( FILE *f ); -#endif - -extern FILE *T1Open ( char *fn, char *mode ); -extern int T1Getc ( FILE *f ); -extern int T1Ungetc ( int c, FILE *f ); -extern int T1Read ( char *buffP, int size, int n, FILE *f ); -extern int T1Close ( FILE *f ); -extern FILE *T1eexec ( FILE *f ); -extern void resetDecrypt ( void ); - -#undef fclose -#undef fopen -#undef ungetc -#undef fgetc -#undef fread -#undef feof -#undef ferror -#define fclose(f) T1Close(f) -#define fopen(name,mode) T1Open(name,mode) -#define ungetc(c,f) T1Ungetc(c,f) -#define fgetc(f) T1Getc(f) - -#define fread(bufP,size,n,f) T1Read(bufP,size,n,f) -#define feof(f) (((f)->flags & FIOEOF) && ((f)->b_cnt==0)) -#define ferror(f) (((f)->flags & FIOERROR)?(f)->error:0) diff --git a/nx-X11/lib/font/Type1/t1stub.c b/nx-X11/lib/font/Type1/t1stub.c deleted file mode 100644 index 2fb1d797f..000000000 --- a/nx-X11/lib/font/Type1/t1stub.c +++ /dev/null @@ -1,56 +0,0 @@ -/* $Xorg: t1stub.c,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/t1stub.c,v 1.8 2001/01/17 19:43:24 dawes Exp $ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef FONTMODULE -#include "Xdefs.h" /* Bool declaration */ -#include "Xmd.h" /* INT32 declaration */ -#include "os.h" -#include "xf86_ansic.h" -#else -#include -#endif -#include "objects.h" /* get #define for Abort() */ - -static void -xiStub(void) -{ - printf("xiStub called\n"); - Abort("xiStub called"); -} - -void -t1_DumpText(void) -{ - xiStub(); -} diff --git a/nx-X11/lib/font/Type1/t1test.c b/nx-X11/lib/font/Type1/t1test.c deleted file mode 100644 index 1da74168f..000000000 --- a/nx-X11/lib/font/Type1/t1test.c +++ /dev/null @@ -1,246 +0,0 @@ -/* $Xorg: t1test.c,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ - -#include -#include - -#define DECIPOINTSPERINCH 722.7 -#define DEFAULTRES 75 -#define DEFAULTPOINTSIZE 120 - -FontScalableRec vals; -FontEntryRec entry; - -int main(argc, argv) - int argc; - char *argv[]; -{ - int h; - char temp[80]; - char file[80]; - char glyphcode[1]; - FontPtr fontptr; - CharInfoRec *glyphs[1]; - int count; - int code; - int rc = -1; - - T1FillVals(&vals); - Type1RegisterFontFileFunctions(); - entry.name.name = "-adobe-utopia-medium-r-normal--0-0-0-0-p-0-iso8859-1"; - - for (;;) { - printf("T1TEST: "); - gets(temp); - glyphcode[0] = '\0'; - - switch(temp[0]) { - - case 'c': - if (1 != sscanf(&temp[2], "%c", glyphcode)) - printf("glyph code?\n"); - break; - - case 'x': - if (1 != sscanf(&temp[2], "%x", &code)) - printf("glyph code?\n"); - else - glyphcode[0] = code; - break; - - case 'd': - if (1 != sscanf(&temp[2], "%d", &code)) - printf("glyph code?\n"); - else - glyphcode[0] = code; - break; - - case 'h': - if (1 != sscanf(&temp[2], "%d", &h)) - printf("height?\n"); - vals.pixel = h; - rc = Type1OpenScalable(NULL, &fontptr, 0, &entry, file, &vals, 0, 0); - break; - - case 'f': - if (1 != sscanf(&temp[2], "%s", file)) - printf("file name?\n"); - rc = Type1OpenScalable(NULL, &fontptr, 0, &entry, file, &vals, 0, 0); - break; - - case 't': - if (1 != sscanf(&temp[2], "%s", file)) - printf("file name?\n"); - vals.pixel = 8; - rc = Type1OpenScalable(NULL, &fontptr, 0, &entry, file, &vals, 0, 0); - if (rc != Successful) break; - vals.pixel = 20; - rc = Type1OpenScalable(NULL, &fontptr, 0, &entry, file, &vals, 0, 0); - if (rc != Successful) break; - vals.pixel = 50; - rc = Type1OpenScalable(NULL, &fontptr, 0, &entry, file, &vals, 0, 0); - glyphcode[0] = 'A'; - printf("From font '%s':\n", file); - break; - - case 'q': - return 0; - - default: - printf("unknown command '%c', must one of 'qfchdxt'\n", temp[0]); - - } - if (rc == Successful) { - if (glyphcode[0] != '\0') { - (*fontptr->get_glyphs)(fontptr, 1, glyphcode, 0, &count, glyphs); - if (count > 0) - Display(glyphs[0]); - else - printf("Code %x not valid in this font\n", glyphcode[0]); - } - } - else - printf("Bad font (rc = %d, file='%s')\n", rc, file); - } -} - -static void Display(glyph) - CharInfoRec *glyph; -{ - int h,w; - unsigned char *p; - int data; - int i; - - p = glyph->bits; - - printf("Metrics: left=%d, right=%d, w=%d, above=%d, below=%d\n", - glyph->metrics.leftSideBearing, - glyph->metrics.rightSideBearing, - glyph->metrics.characterWidth, - glyph->metrics.ascent, - glyph->metrics.descent); - - for (h=glyph->metrics.ascent + glyph->metrics.descent; --h >= 0;) { - w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing; - while (w > 0) { - data = *p++; - for (i=0; i<8; i++) { - if (--w < 0) - break; - if (data & 0x80) - printf("X"); - else - printf("."); - data <<= 1; - } - } - printf("\n"); - } -} - -T1FillVals(vals) - FontScalablePtr vals; -{ - FontResolutionPtr res; - int x_res = DEFAULTRES; - int y_res = DEFAULTRES; - int pointsize = DEFAULTPOINTSIZE; /* decipoints */ - int num_res; - - /* Must have x, y, and pixel */ - if (!vals->x || !vals->y || !vals->pixel) { - res = GetClientResolutions(&num_res); - if (num_res) { - if (res->x_resolution) - x_res = res->x_resolution; - if (res->y_resolution) - y_res = res->y_resolution; - if (res->point_size) - pointsize = res->point_size; - } - if (!vals->x) - vals->x = x_res; - if (!vals->y) - vals->y = y_res; - if (!vals->point) { - if (!vals->pixel) vals->point = pointsize; - else vals->point = (vals->pixel * DECIPOINTSPERINCH) / vals->y; - } - if (!vals->pixel) - vals->pixel = (vals->point * vals->y) / DECIPOINTSPERINCH; - /* Make sure above arithmetic is normally in range and will - round properly. +++ */ - } -} - -int CheckFSFormat(format, fmask, bit, byte, scan, glyph, image) - int format,fmask,*bit,*byte,*scan,*glyph,*image; -{ - *bit = *byte = 1; - *glyph = *scan = *image = 1; - return Successful; - -} - -char *MakeAtom(p) - char *p; -{ - return p; -} - - -FontResolutionPtr GetClientResolutions(resP) - int *resP; -{ - *resP = 0; -}; - -char *Xalloc(size) - int size; -{ - extern char *malloc(); - return(malloc(size)); -} - -void Xfree() -{ - free(); -} - -FontDefaultFormat() { ; } - -FontFileRegisterRenderer() { ; } - -GenericGetBitmaps() { ; } -GenericGetExtents() { ; } - -FontParseXLFDName() { ; } -FontComputeInfoAccelerators() { ; } diff --git a/nx-X11/lib/font/Type1/t1unicode.c b/nx-X11/lib/font/Type1/t1unicode.c deleted file mode 100644 index 136cc4441..000000000 --- a/nx-X11/lib/font/Type1/t1unicode.c +++ /dev/null @@ -1,251 +0,0 @@ -/* -Copyright (c) 1998 by Juliusz Chroboczek - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -/* $XFree86$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include "t1unicode.h" - -static char* table_32[] = -{ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", - "ampersand", "quotesingle", "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", "grave", - "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", 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, "space", "exclamdown", "cent", "sterling", "currency", "yen", - "brokenbar", "section", "dieresis", "copyright", "ordfeminine", - "guillemotleft", "logicalnot", "hyphen", "registered", "macron", - "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", - "paragraph", "periodcentered", "cedilla", "onesuperior", - "ordmasculine", "guillemotright", "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", "Amacron", "amacron", "Abreve", "abreve", "Aogonek", - "aogonek", "Cacute", "cacute", "Ccircumflex", "ccircumflex", - "Cdotaccent", "cdotaccent", "Ccaron", "ccaron", "Dcaron", "dcaron", - "Dcroat", "dcroat", "Emacron", "emacron", "Ebreve", "ebreve", - "Edotaccent", "edotaccent", "Eogonek", "eogonek", "Ecaron", "ecaron", - "Gcircumflex", "gcircumflex", "Gbreve", "gbreve", "Gdotaccent", - "gdotaccent", "Gcommaaccent", "gcommaaccent", "Hcircumflex", - "hcircumflex", "Hbar", "hbar", "Itilde", "itilde", "Imacron", - "imacron", "Ibreve", "ibreve", "Iogonek", "iogonek", "Idotaccent", - "dotlessi", "IJ", "ij", "Jcircumflex", "jcircumflex", "Kcommaaccent", - "kcommaaccent", "kgreenlandic", "Lacute", "lacute", "Lcommaaccent", - "lcommaaccent", "Lcaron", "lcaron", "Ldot", "ldot", "Lslash", - "lslash", "Nacute", "nacute", "Ncommaaccent", "ncommaaccent", - "Ncaron", "ncaron", "napostrophe", "Eng", "eng", "Omacron", "omacron", - "Obreve", "obreve", "Ohungarumlaut", "ohungarumlaut", "OE", "oe", - "Racute", "racute", "Rcommaaccent", "rcommaaccent", "Rcaron", - "rcaron", "Sacute", "sacute", "Scircumflex", "scircumflex", - "Scommaaccent", "scommaaccent", "Scaron", "scaron", "Tcommaaccent", - "tcommaaccent", "Tcaron", "tcaron", "Tbar", "tbar", "Utilde", - "utilde", "Umacron", "umacron", "Ubreve", "ubreve", "Uring", "uring", - "Uhungarumlaut", "uhungarumlaut", "Uogonek", "uogonek", "Wcircumflex", - "wcircumflex", "Ycircumflex", "ycircumflex", "Ydieresis", "Zacute", - "zacute", "Zdotaccent", "zdotaccent", "Zcaron", "zcaron", "longs", 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "florin", 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Ohorn", "ohorn", 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, "Uhorn", "uhorn", 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Gcaron", - "gcaron", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - "Aringacute", "aringacute", "AEacute", "aeacute", "Oslashacute", - "oslashacute", 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii57929", "afii64937", 0, 0, 0, 0, 0, 0, - 0, 0, "circumflex", "caron", 0, "macron", 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, "breve", "dotaccent", "ring", "ogonek", "tilde", - "hungarumlaut", 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, "gravecomb", - "acutecomb", 0, "tildecomb", 0, 0, 0, 0, 0, "hookabovecomb", 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, - "dotbelowcomb", 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, 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, 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, "tonos", "dieresistonos", "Alphatonos", - "anoteleia", "Epsilontonos", "Etatonos", "Iotatonos", 0, - "Omicrontonos", 0, "Upsilontonos", "Omegatonos", "iotadieresistonos", - "Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta", "Theta", - "Iota", "Kappa", "Lambda", "Mu", "Nu", "Xi", "Omicron", "Pi", "Rho", - 0, "Sigma", "Tau", "Upsilon", "Phi", "Chi", "Psi", "Omega", - "Iotadieresis", "Upsilondieresis", "alphatonos", "epsilontonos", - "etatonos", "iotatonos", "upsilondieresistonos", "alpha", "beta", - "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", - "lambda", "mu", "nu", "xi", "omicron", "pi", "rho", "sigma1", "sigma", - "tau", "upsilon", "phi", "chi", "psi", "omega", "iotadieresis", - "upsilondieresis", "omicrontonos", "upsilontonos", "omegatonos", 0, 0, - "theta1", "Upsilon1", 0, 0, "phi1", "omega1", 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, 0, 0, 0, 0, 0, 0, 0, 0, "afii10023", "afii10051", - "afii10052", "afii10053", "afii10054", "afii10055", "afii10056", - "afii10057", "afii10058", "afii10059", "afii10060", "afii10061", 0, - "afii10062", "afii10145", "afii10017", "afii10018", "afii10019", - "afii10020", "afii10021", "afii10022", "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", "afii10065", - "afii10066", "afii10067", "afii10068", "afii10069", "afii10070", - "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", 0, "afii10071", "afii10099", "afii10100", "afii10101", - "afii10102", "afii10103", "afii10104", "afii10105", "afii10106", - "afii10107", "afii10108", "afii10109", 0, "afii10110", "afii10193", 0, - 0, "afii10146", "afii10194", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - "afii10147", "afii10195", "afii10148", "afii10196", 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, - "afii10050", "afii10098", 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, 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, 0, 0, 0, "afii10846", 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, 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, 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, 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, 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, - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - "afii57799", "afii57801", "afii57800", "afii57802", "afii57793", - "afii57794", "afii57795", "afii57798", "afii57797", "afii57806", 0, - "afii57796", "afii57807", "afii57839", "afii57645", "afii57841", - "afii57842", "afii57804", "afii57803", "afii57658", 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, "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", 0, 0, 0, 0, 0, "afii57716", - "afii57717", "afii57718", 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, "afii57388", 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, "afii57403", 0, 0, 0, "afii57407", 0, "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", 0, 0, - 0, 0, 0, "afii57440", "afii57441", "afii57442", "afii57443", - "afii57444", "afii57445", "afii57446", "afii57470", "afii57448", - "afii57449", "afii57450", "afii57451", "afii57452", "afii57453", - "afii57454", "afii57455", "afii57456", "afii57457", "afii57458", 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii57392", "afii57393", - "afii57394", "afii57395", "afii57396", "afii57397", "afii57398", - "afii57399", "afii57400", "afii57401", "afii57381", 0, 0, "afii63167", - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii57511", 0, 0, 0, 0, "afii57506", - 0, 0, 0, 0, 0, 0, 0, "afii57507", 0, "afii57512", 0, 0, 0, 0, 0, 0, 0, - 0, "afii57513", 0, 0, 0, 0, 0, 0, "afii57508", 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, "afii57505", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii57509", 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, "afii57514", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii57519", 0, 0, "afii57534", 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, 0, 0, 0, 0, 0, 0, 0, 0 }; - -static char* table_2000[] = /* general punctuation, s*scripts, currency */ -{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "afii61664", "afii301", "afii299", - "afii300", 0, 0, "figuredash", "endash", "emdash", "afii00208", 0, - "underscoredbl", "quoteleft", "quoteright", "quotesinglbase", - "quotereversed", "quotedblleft", "quotedblright", "quotedblbase", 0, - "dagger", "daggerdbl", "bullet", 0, "onedotenleader", - "twodotenleader", "ellipsis", 0, 0, 0, 0, 0, "afii61573", "afii61574", - "afii61575", 0, "perthousand", 0, "minute", "second", 0, 0, 0, 0, 0, - "guilsinglleft", "guilsinglright", 0, "exclamdbl", 0, 0, 0, 0, 0, 0, - 0, "fraction", 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, 0, 0, 0, 0, 0, 0, 0, - 0, 0, "zerosuperior", 0, 0, 0, "foursuperior", "fivesuperior", - "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", 0, 0, - 0, "parenleftsuperior", "parenrightsuperior", "nsuperior", - "zeroinferior", "oneinferior", "twoinferior", "threeinferior", - "fourinferior", "fiveinferior", "sixinferior", "seveninferior", - "eightinferior", "nineinferior", 0, 0, 0, "parenleftinferior", - "parenrightinferior", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, "colonmonetary", 0, "franc", "lira", 0, 0, "peseta", 0, 0, - "afii57636", "dong", "Euro", 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, 0 }; - -static char* table_2500[]= /* line and box drawing */ -{ "SF100000", 0, "SF110000", 0, 0, 0, 0, 0, 0, 0, 0, 0, "SF010000", 0, - 0, 0, "SF030000", 0, 0, 0, "SF020000", 0, 0, 0, "SF040000", 0, 0, 0, - "SF080000", 0, 0, 0, 0, 0, 0, 0, "SF090000", 0, 0, 0, 0, 0, 0, 0, - "SF060000", 0, 0, 0, 0, 0, 0, 0, "SF070000", 0, 0, 0, 0, 0, 0, 0, - "SF050000", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - "SF430000", "SF240000", "SF510000", "SF520000", "SF390000", - "SF220000", "SF210000", "SF250000", "SF500000", "SF490000", - "SF380000", "SF280000", "SF270000", "SF260000", "SF360000", - "SF370000", "SF420000", "SF190000", "SF200000", "SF230000", - "SF470000", "SF480000", "SF410000", "SF450000", "SF460000", - "SF400000", "SF540000", "SF530000", "SF440000", 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "upblock", 0, 0, 0, "dnblock", 0, - 0, 0, "block", 0, 0, 0, "lfblock", 0, 0, 0, "rtblock", "ltshade", - "shade", "dkshade", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - -static char* table_FB00[] = /* alphabetic presentation forms */ -{ "ff", "fi", "fl", "ffi", "ffl", 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, "afii57705", 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, "afii57694", "afii57695", 0, 0, 0, 0, 0, 0, 0, 0, 0, - "afii57723", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, "afii57700", 0, 0, 0, 0 }; - -char* -unicodetoPSname(unsigned short code) -{ - if(code<32) return 0; - else if(code<0x6FF) return table_32[code-32]; - else if(code<0x2000) return 0; - else if(code<0x20D0) return table_2000[code-0x2000]; - else if(code==0x2116) return "afii61352"; /* numero sign, for Koi */ - else if(code==0x2122) return "trademark"; - else if(code<0x2500) return 0; - else if(code<0x25A0) return table_2500[code-0x2500]; - else if(code<0xFB00) return 0; - else if(code<0xFB50) return table_FB00[code-0xFB00]; - else return 0; -} diff --git a/nx-X11/lib/font/Type1/t1unicode.h b/nx-X11/lib/font/Type1/t1unicode.h deleted file mode 100644 index bad0274a0..000000000 --- a/nx-X11/lib/font/Type1/t1unicode.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 1998 by Juliusz Chroboczek - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -/* $XFree86$ */ - -char *unicodetoPSname(unsigned short code); diff --git a/nx-X11/lib/font/Type1/token.c b/nx-X11/lib/font/Type1/token.c deleted file mode 100644 index 71a968b30..000000000 --- a/nx-X11/lib/font/Type1/token.c +++ /dev/null @@ -1,1208 +0,0 @@ -/* $Xorg: token.c,v 1.4 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/token.c,v 1.5tsi Exp $ */ -/* Authors: Sig Nin & Carol Thompson IBM Almaden Research Laboratory */ -#ifdef HAVE_CONFIG_H -#include -#endif -#include "t1stdio.h" -#include "util.h" -#include "digit.h" -#include "token.h" -#include "tokst.h" -#include "hdigit.h" - -/* - * ------------------------------------------------------------------- - * Globals - * ------------------------------------------------------------------- - */ - -/* These variables are set by the caller */ -char *tokenStartP; /* Pointer to token buffer in VM */ -char *tokenMaxP; /* Pointer to last byte in buffer + 1 */ - -/* These variables are set by TOKEN */ -int tokenLength; /* Characters in token */ -boolean tokenTooLong; /* Token too long for buffer */ -int tokenType; /* Type of token identified */ -psvalue tokenValue; /* Token value */ - -/* - * ------------------------------------------------------------------- - * Private variables - * ------------------------------------------------------------------- - */ - -static FILE *inputFileP; /* Current input file */ - - -/* Token */ -static char *tokenCharP; /* Pointer to next character in token */ - -/* - * ------------------------------------------------------------------- - * Private routines for manipulating numbers - * ------------------------------------------------------------------- - */ - -#define Exp10(e) \ -((e) == 0\ - ? (double)(1.0)\ - : (-64 <= (e) && (e) <= 63\ - ? Exp10T[(e)+64]\ - : P10(e)\ - )\ -) - -static double Exp10T[128] = { - 1e-64, 1e-63, 1e-62, 1e-61, 1e-60, 1e-59, 1e-58, 1e-57, - 1e-56, 1e-55, 1e-54, 1e-53, 1e-52, 1e-51, 1e-50, 1e-49, - 1e-48, 1e-47, 1e-46, 1e-45, 1e-44, 1e-43, 1e-42, 1e-41, - 1e-40, 1e-39, 1e-38, 1e-37, 1e-36, 1e-35, 1e-34, 1e-33, - 1e-32, 1e-31, 1e-30, 1e-29, 1e-28, 1e-27, 1e-26, 1e-25, - 1e-24, 1e-23, 1e-22, 1e-21, 1e-20, 1e-19, 1e-18, 1e-17, - 1e-16, 1e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, - 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, - 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, - 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, - 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30, 1e31, - 1e32, 1e33, 1e34, 1e35, 1e36, 1e37, 1e38, 1e39, - 1e40, 1e41, 1e42, 1e43, 1e44, 1e45, 1e46, 1e47, - 1e48, 1e49, 1e50, 1e51, 1e52, 1e53, 1e54, 1e55, - 1e56, 1e57, 1e58, 1e59, 1e60, 1e61, 1e62, 1e63 -}; - -static double -P10(long exponent) -{ - double value, power; - - if (exponent < 0) { - power = 0.1; - value = (exponent & 1 ? power : 1.0); - exponent++; - exponent = -(exponent >> 1); /* portable C for -(exponent/2) */ - } - else { - power = 10.0; - value = (exponent & 1 ? power : 1.0); - exponent = exponent >> 1; - } - - while(exponent > 0) { - power *= power; - if (exponent & 1) - value *= power; - exponent >>= 1; - } - - return(value); -} - -/* - * ------------------------------------------------------------------- - * Private routines and macros for manipulating the input - * ------------------------------------------------------------------- - */ - -/* Get next character from the input -- - * - */ -#define next_ch() (_XT1getc(inputFileP)) - -/* Push a character back into the input -- - * - * Ungetc of EOF will fail, but that's ok: the next getc will - * return EOF. - * - * NOTE: These macros are presently written to return the character - * pushed, or EOF if none was pushed. However, they are not - * required to return anything in particular, and callers should - * not rely on the returned value. - */ -#define back_ch(ch) (T1Ungetc(ch, inputFileP)) - -/* Push a character back into the input if it was not white space. - * If it is a carriage return (\r) then check next char for - * linefeed and consume them both, otherwise put next char back. - * - */ -#define back_ch_not_white(ch) \ -(\ -isWHITE_SPACE(ch)\ - ? ((ch == '\r')\ - ? (((ch = next_ch()) == '\n')\ - ? EOF\ - : back_ch(ch)\ - )\ - : EOF\ - )\ - : back_ch(ch)\ -) - -/* - * ------------------------------------------------------------------- - * Private routines and macros for manipulating the token buffer - * ------------------------------------------------------------------- - */ - -/* Add a character to the token - * ---- use ONLY when you KNOW that this character will - * be stored within the token buffer. - */ -#define save_unsafe_ch(ch) (*tokenCharP++ = ch) - -/* Add a character to the token, if not too long to fit */ -#define save_ch(ch) \ -((tokenCharP < tokenMaxP)\ - ? save_unsafe_ch(ch)\ - : (tokenTooLong = TRUE)\ -) - -#define save_ch_no_inc(ch) \ -if (tokenCharP < tokenMaxP) *tokenCharP = ch - -/* - * ------------------------------------------------------------------- - * Action Routines - * - * These routines all - * -- take int ch as a parameter - * -- return int ch if no token was recognized, DONE otherwise - * -- leave the next character in the input, if returning DONE - * ------------------------------------------------------------------- - */ - -#define DONE (256) - -/* Get the next input character */ -static int -next_char(int ch) -{ - return(next_ch()); -} - -/* Add character to token */ -static int -add_char(int ch) -{ - save_ch(ch); - return(next_ch()); -} - - -/* ------------------------------------------------------------------- - * Skip white space and comments - */ - -/* Skip white space */ -static int -skip_space(int ch) -{ - do { - ch = next_ch(); - } while(isWHITE_SPACE(ch)); - return(ch); -} - -/* Skip comments */ -static int -skip_comment(int ch) -{ - do { - ch = next_ch(); - } while(isCOMMENT(ch)); - return(ch); -} - -/* ------------------------------------------------------------------- - * Collect value elements for a number - */ - -/* decimal integer or real number mantissa */ -static int m_sign; -static long m_value; -static long m_scale; - -/* real number exponent */ -static int e_sign; -static long e_value; - -/* radix number */ -static long r_base; -static long r_value; -static long r_scale; - -static int -add_sign(int ch) -{ - m_sign = ch; - save_unsafe_ch(ch); - return(next_ch()); -} - -static int -add_1st_digits(int ch) -{ - m_sign = '+'; - return(add_digits(ch)); -} - -static int -add_digits(int ch) -{ - long value, p_value, scale; - int digit; - - /* On entry, expect m_sign to be set to '+' or '-'; - * ch is a decimal digit. - * Expect at most one character saved at this point, - * a sign. This routine will save up to 10 more - * characters without checking the buffer boundary. - */ - - value = ch - '0'; - save_unsafe_ch(ch); - ch = next_ch(); - - while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { - value = (value << 3) + (value << 1) + (ch - '0'); - save_unsafe_ch(ch); - ch = next_ch(); - } - - /* Quick exit for small integers -- - * |x| <= 10*((MAX_INTEGER/10)-1)+9 - * |x| <= 2,147,483,639 for 32 bit integers - */ - if (isNUMBER_ENDER(ch)) { - back_ch_not_white(ch); - tokenValue.integer = (m_sign == '-' ? -value : value); - tokenType = TOKEN_INTEGER; - return(DONE); - } - - /* Handle additional digits. Beyond the boundary case, - * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER - * just count the digits: the number is too large to - * represent as an integer and will be returned as a real. - * The mantissa of a real holds fewer bits than an integer. - */ - p_value = value; - value = (m_sign == '-' ? -value : value); - scale = 0; - - if (isDECIMAL_DIGIT(ch)) { - - /* Handle the boundary case */ - if (p_value == (MAX_INTEGER/10)) { - digit = ch - '0'; - - /* Must handle positive and negative values separately */ - /* for 2's complement arithmetic */ - if (value > 0) { - if (digit <= MAX_INTEGER%10) - value = (value << 3) + (value << 1) + digit; - else - ++scale; /* Too big, just count it */ - } - else { - /* Use positive % operands for portability */ - if (digit <= -(MIN_INTEGER+10)%10) - value = (value << 3) + (value << 1) - digit; - else - ++scale; /* Too big, just count it */ - } - } - else - ++scale; /* Not boundary case, just count digit */ - - save_unsafe_ch(ch); - ch = next_ch(); - - /* Continue scanning digits, but can't store them */ - while(isDECIMAL_DIGIT(ch)) { - ++scale; - save_ch(ch); - ch = next_ch(); - } - } - - /* Continue from here scanning radix integer or real */ - m_value = value; - m_scale = scale; - - /* Initialize for possible real */ - e_sign = '+'; - e_value = 0; - - return(ch); -} - -static int -add_1st_decpt(int ch) -{ - m_sign = '+'; - return(add_decpt(ch)); -} - -static int -add_decpt(int ch) -{ - /* On entry, expect m_sign to be set to '+' or '-' */ - m_value = 0; - m_scale = 0; - save_unsafe_ch(ch); - return(next_ch()); -} - -static int -add_fraction(int ch) -{ - long value, scale; - int digit; - - /* On entry, expect m_value and m_scale to be initialized, - * and m_sign to be set to '+' or '-'. Expect m_value and m_sign - * to be consistent (this is not checked). - */ - value = m_value; - scale = m_scale; - - /* Scan leading zeroes */ - if (value == 0) { - while(ch == '0') { - --scale; - save_ch(ch); - ch = next_ch(); - } - - /* Scan first significant digit */ - if (isDECIMAL_DIGIT(ch)) { - --scale; - value = ch - '0'; - value = (m_sign == '-' ? -value : value); - save_ch(ch); - ch = next_ch(); - } - else - /* no significant digits -- number is zero */ - scale = 0; - } - /* value != 0 || value == 0 && !isDECIMAL_DIGIT(ch) */ - - /* Scan additional significant digits */ - if (isDECIMAL_DIGIT(ch)) { - if (value > 0) { - while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { - --scale; - value = (value << 3) + (value << 1) + (ch - '0'); - save_ch(ch); - ch = next_ch(); - } - /* Check boundary case */ - if (isDECIMAL_DIGIT(ch) && value == (MAX_INTEGER/10)) { - digit = ch - '0'; - if (digit <= MAX_INTEGER%10) { - --scale; - value = (value << 3) + (value << 1) + digit; - save_ch(ch); - ch = next_ch(); - } - } - } - else { - /* value < 0 */ - while(isDECIMAL_DIGIT(ch) && value > -(-(MIN_INTEGER+10)/10+1)) { - /* Use positive / operands for portability */ - --scale; - value = (value << 3) + (value << 1) - (ch - '0'); - save_ch(ch); - ch = next_ch(); - } - /* Check boundary case */ - if (isDECIMAL_DIGIT(ch) - && value == -(-(MIN_INTEGER+10)/10+1)) { - digit = ch - '0'; - if (digit <= -(MIN_INTEGER+10)%10) { - /* Use positive % operands for portability */ - --scale; - value = (value << 3) + (value << 1) - digit; - save_ch(ch); - ch = next_ch(); - } - } - } - - /* Additional digits can be discarded */ - while(isDECIMAL_DIGIT(ch)) { - save_ch(ch); - ch = next_ch(); - } - } - - /* Store results */ - m_value = value; - m_scale = scale; - - /* Initialize for possible real */ - e_sign = '+'; - e_value = 0; - - return(ch); -} - -static int -add_e_sign(int ch) -{ - e_sign = ch; - save_ch(ch); - return(next_ch()); -} - -static int -add_exponent(int ch) -{ - long value, p_value; - long scale = 0; - int digit; - - /* On entry, expect e_sign to be set to '+' or '-' */ - - value = ch - '0'; - save_ch(ch); - ch = next_ch(); - - while(isDECIMAL_DIGIT(ch) && value < (MAX_INTEGER/10)) { - value = (value << 3) + (value << 1) + (ch - '0'); - save_ch(ch); - ch = next_ch(); - } - - p_value = value; - value = (e_sign == '-' ? -value : value); - - /* Handle additional digits. Beyond the boundary case, - * 10*(MAX_INTEGER/10) <= |number| <= MAX_INTEGER - * just count the digits: the number is too large to - * represent as an integer. - */ - if (isDECIMAL_DIGIT(ch)) { - - /* Examine boundary case */ - if (p_value == (MAX_INTEGER/10)) { - digit = ch - '0'; - - /* Must handle positive and negative values separately */ - /* for 2's complement arithmetic */ - if (value > 0) { - if (digit <= MAX_INTEGER%10) - value = (value << 3) + (value << 1) + digit; - else - ++scale; /* Too big, just count it */ - } - else { - /* Use positive % operands for portability */ - if (digit <= -(MIN_INTEGER+10)%10) - value = (value << 3) + (value << 1) - digit; - else - ++scale; /* Too big, just count it */ - } - } - else - ++scale; /* Not boundary case, just count digit */ - - save_ch(ch); - ch = next_ch(); - - /* Continue scanning digits, but can't store any more */ - while(isDECIMAL_DIGIT(ch)) { - ++scale; - save_ch(ch); - ch = next_ch(); - } - } - - /* Store results */ - e_value = value; - - return(ch); -} - -static int -add_radix(int ch) -{ - if (2 <= m_value && m_value <= 36 && m_scale == 0) { - r_base = m_value; - save_ch(ch); - return(next_ch()); - } - else { - /* Radix invalid, complete a name token */ - return(AAH_NAME(ch)); - } -} - -static int -add_r_digits(int ch) -{ - unsigned long value; - long radix, scale; - int digit; - - /* NOTE: The syntax of a radix number allows only for - * values of zero or more. The value will be stored as - * a 32 bit integer, which PostScript then interprets - * as signed. This means, for example, that the numbers: - * - * 8#37777777777 - * 10#4294967295 - * 16#FFFFFFFF - * 36#1Z141Z3 - * - * are all interpreted as -1. This routine implements this - * idea explicitly: it accumulates the number's value - * as unsigned, then casts it to signed when done. - */ - - /* Expect r_base to be initialized */ - radix = r_base; - value = 0; - scale = 0; - - /* Scan leading zeroes */ - while(ch == '0') { - save_ch(ch); - ch = next_ch(); - } - - /* Handle first non-zero digit */ - if ((digit=digit_value[ch]) < radix) { - value = digit; - save_ch(ch); - ch = next_ch(); - - /* Add digits until boundary case reached */ - while((digit=digit_value[ch]) < radix - && value < (MAX_ULONG / radix)) { - value = value * radix + digit; - save_ch(ch); - ch = next_ch(); - }; - - /* Scan remaining digits */ - if ((digit=digit_value[ch]) < radix) { - - /* Examine boundary case --- - * radix*(MAX_ULONG/radix) <= number <= MAX_ULONG - */ - if (value == (MAX_ULONG/radix) && digit <= MAX_ULONG%radix) - value = value * radix + digit; - else - ++scale; - - /* Continue scanning digits, but can't store them */ - save_ch(ch); - ch = next_ch(); - while(digit_value[ch] < radix) { - ++scale; - save_ch(ch); - ch = next_ch(); - } - } - } - - /* Store result */ - r_value = (long) value; /* result is signed */ - r_scale = scale; - - return(ch); -} - -/* ------------------------------------------------------------------- - * Complete a number; set token type and done flag. - * Put current input character back, if it is not white space. - */ - -/* Done: Radix Number */ -static int -RADIX_NUMBER(int ch) -{ - back_ch_not_white(ch); - if (r_scale == 0) { - tokenValue.integer = r_value; - tokenType = TOKEN_INTEGER; - } - else { - tokenType = TOKEN_NAME; - } - return(DONE); -} - -/* Done: Integer */ -static int -INTEGER(int ch) -{ - back_ch_not_white(ch); - if (m_scale == 0) { - tokenValue.integer = m_value; - tokenType = TOKEN_INTEGER; - } - else { - tokenValue.real = (double)(m_value) * Exp10(m_scale); - tokenType = TOKEN_REAL; - } - return(DONE); -} - -/* Done: Real */ -static int -REAL(int ch) -{ - double temp; - - back_ch_not_white(ch); - - /* HAZARD: exponent overflow of intermediate result - * (e.g., in 370 floating point); this should not be a problem - * with IEEE floating point. Reduce exponent overflow hazard by - * combining m_scale and e_value first, if they have different signs, - * or multiplying m_value and one of the other factors, if both - * m_scale and e_value are negative. - */ - if ((m_scale >= 0 && e_value <= 0) - || (m_scale <= 0 && e_value >= 0)) { - tokenValue.real = (double)(m_value) * Exp10(m_scale + e_value); - } - else { - temp = (double)(m_value) * Exp10(m_scale); - tokenValue.real = temp * Exp10(e_value); - } - - tokenType = TOKEN_REAL; - return(DONE); -} - - -/* ------------------------------------------------------------------- - * Assemble a hex string; set token type and done flag. - */ - -/* Done: Hex String */ -static int -HEX_STRING(int ch) -{ - int value; - - while(TRUE) { - - /* Process odd digit */ - ch = next_ch(); - if (!isHEX_DIGIT(ch)) { - - /* Skip white space */ - while(isWHITE_SPACE(ch)) - ch = next_ch(); - - /* Check for terminator */ - if (!isHEX_DIGIT(ch)) { - break; - } - } - value = digit_value[ch] << 4; - - /* Process even digit */ - ch = next_ch(); - if (!isHEX_DIGIT(ch)) { - - /* Skip white space */ - while(isWHITE_SPACE(ch)) - ch = next_ch(); - - /* Check for terminator */ - if (!isHEX_DIGIT(ch)) { - save_ch(value); - break; - } - } - save_ch(value + digit_value[ch]); - } - - /* Classify result, based on why loop ended */ - if (ch == '>') - tokenType = TOKEN_HEX_STRING; - else { - /* save the invalid character for error reporting */ - save_ch(ch); - tokenType = TOKEN_INVALID; - } - - return(DONE); -} - -/* ------------------------------------------------------------------- - * Assemble a string; set token type and done flag - */ - -/* Save a backslash-coded character in a string -- - * - * Store the proper character for special cases - * "\b", "\f", "\n", "\r", and "\t". - * - * Decode and store octal-coded character, up to - * three octal digits, "\o", "\oo", and "\ooo". - * - * The sequence "\" is a line continuation, - * so consume both without storing anything. - * - * The sequence "\" is an error; exit without - * storing anything and let the caller handle it. - * - * For other characters, including the sequences - * "\\", "\(", and "\)", simply store the second - * character. - */ -static void -save_digraph(int ch) -{ - int value; - - switch (ch) { - - case 'b': /* backspace */ - ch = '\b'; - break; - - case 'f': /* formfeed */ - ch = '\f'; - break; - - case 'n': /* newline */ - ch = '\n'; - break; - - case 'r': /* carriage return */ - ch = '\r'; - break; - - case 't': /* horizontal tab */ - ch = '\t'; - break; - - case '\n': /* line continuation -- consume it */ - return; - - case '\r': /* carriage return -- consume it */ - ch = next_ch(); /* look at next character, is it \n? */ - if (ch == '\n') return; - back_ch(ch); /* if not a line feed, then return it */ - return; - - case EOF: /* end of file -- forget it */ - return; - - default: - /* scan up to three octal digits to get value */ - if (isOCTAL_DIGIT(ch)) { - value = digit_value[ch]; - ch = next_ch(); - if (isOCTAL_DIGIT(ch)) { - value = (value << 3) + digit_value[ch]; - ch = next_ch(); - if (isOCTAL_DIGIT(ch)) - value = (value << 3) + digit_value[ch]; - else - back_ch(ch); - } - else - back_ch(ch); - ch = value; - } - } - - /* Found a character to save */ - save_ch(ch); -} - -/* Done: String */ -static int -STRING(int ch) -{ - int nest_level = 1; - - tokenType = TOKEN_STRING; - - do { - - ch = next_ch(); - while(!isSTRING_SPECIAL(ch)) { - save_ch(ch); - ch = next_ch(); - }; - - switch (ch) { - - case '(': - ++nest_level; - save_ch(ch); - break; - - case ')': - if (--nest_level > 0) - save_ch(ch); - break; - - case '\\': - save_digraph(next_ch()); - break; - - case '\r': - /* All carriage returns (\r) are turned into linefeeds (\n)*/ - ch = next_ch(); /* get the next one, is it \n? */ - if (ch != '\n') { /* if not, then put it back. */ - back_ch(ch); - } - save_ch('\n'); /* in either case, save a linefeed */ - break; - - - case EOF: - tokenType = TOKEN_INVALID; /* Unterminated string */ - nest_level = 0; - break; - } - - } while(nest_level > 0); - - /* If there's room, add a 0-byte termination without increasing string - length. This fixes certain dependencies on 0-terminated strings */ - save_ch_no_inc(0); - - return(DONE); -} - - -/* ------------------------------------------------------------------- - * Assemble a name; set token type and done flag. - * Put current input character back, if it is not white space. - */ - -/* Done: Name - * (Safe version used to complete name tokens that - * start out looking like something else). - */ - -static int -AAH_NAME(int ch) -{ - do { - save_ch(ch); - ch = next_ch(); - } while(isNAME(ch)); - - back_ch_not_white(ch); - tokenType = TOKEN_NAME; - return(DONE); -} - -/* Done: Name */ -static int -NAME(int ch) -{ - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - while(isNAME(ch)) { - save_ch(ch); - ch = next_ch(); - } - } - } - } - } - } - } - - back_ch_not_white(ch); - tokenType = TOKEN_NAME; - return(DONE); -} - -/* Done: Literal Name */ -static int -LITERAL_NAME(int ch) -{ - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - while(isNAME(ch)) { - save_ch(ch); - ch = next_ch(); - } - } - } - } - } - } - } - - back_ch_not_white(ch); - tokenType = TOKEN_LITERAL_NAME; - return(DONE); -} - -/* Done: immediate Name */ -static int -IMMED_NAME(int ch) -{ - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - if (isNAME(ch)) { - save_unsafe_ch(ch); - ch = next_ch(); - while(isNAME(ch)) { - save_ch(ch); - ch = next_ch(); - } - } - } - } - } - } - } - - back_ch_not_white(ch); - tokenType = TOKEN_IMMED_NAME; - return(DONE); -} - -/* Done: Name found while looking for something else */ -static int -OOPS_NAME(int ch) -{ - back_ch_not_white(ch); - tokenType = TOKEN_NAME; - return(DONE); -} - - -/* ------------------------------------------------------------------- - * Complete a miscellaneous token; set token type and done flag. - */ - -/* Done: Unmatched Right Angle-Bracket */ -static int -RIGHT_ANGLE(int ch) -{ - tokenType = TOKEN_RIGHT_ANGLE; - return(DONE); -} - -/* Done: Unmatched Right Parenthesis */ -static int -RIGHT_PAREN(int ch) -{ - tokenType = TOKEN_RIGHT_PAREN; - return(DONE); -} - -/* Done: Left Brace */ -static int -LEFT_BRACE(int ch) -{ - tokenType = TOKEN_LEFT_BRACE; - return(DONE); -} - -/* Done: Right Brace */ -static int -RIGHT_BRACE(int ch) -{ - tokenType = TOKEN_RIGHT_BRACE; - return(DONE); -} - -/* Done: Left Bracket */ -static int -LEFT_BRACKET(int ch) -{ - save_unsafe_ch(ch); - tokenType = TOKEN_LEFT_BRACKET; - return(DONE); -} - -/* Done: Right Bracket */ -static int -RIGHT_BRACKET(int ch) -{ - save_unsafe_ch(ch); - tokenType = TOKEN_RIGHT_BRACKET; - return(DONE); -} - -/* Done: Break */ -static int -BREAK_SIGNAL(int ch) -{ - tokenType = TOKEN_BREAK; - return(DONE); -} - -/* Done: No Token Found */ -static int -NO_TOKEN(int ch) -{ - tokenType = TOKEN_EOF; - return(DONE); -} - - -/* - * ------------------------------------------------------------------- - * scan_token -- scan one token from the input. It uses a simple - * finite state machine to recognize token classes. - * - * The input is from a file. - * - * On entry -- - * - * inputP -> input PostScript object, a file. - * tokenStartP -> buffer in VM for accumulating the token. - * tokenMaxP -> last character in the token buffer - * - * On exit -- - * - * tokenLength = number of characters in the token - * tokenTooLong = TRUE if the token did not fit in the buffer - * tokenType = code for the type of token parsed. - * tokenValue = converted value of a numeric token. - * - * - * ------------------------------------------------------------------- - */ -void -scan_token(psobj *inputP) -{ - int ch; - unsigned char *stateP = s0; - unsigned char entry; - int (*actionP)(int); - - /* Define input source */ - inputFileP = inputP->data.fileP; - if (inputFileP == NULL) { - tokenType = TOKEN_EOF; - return; - } - - /* Ensure enough space for most cases - * (so we don't have to keep checking) - * The length needs to cover the maximum number - * of save_unsafe_ch() calls that might be executed. - * That number is 11 (a sign and 10 decimal digits, e.g., - * when scanning -2147483648), but use MAX_NAME_LEN - * in case someone changes that without checking. - */ - tokenStartP = vm_next_byte(); - tokenMaxP = tokenStartP + MIN(vm_free_bytes(), MAX_STRING_LEN); - - if ((tokenMaxP-tokenStartP) < (MAX_NAME_LEN)) { - tokenLength = 0; - tokenTooLong = TRUE; - tokenType = TOKEN_NONE; - tokenValue.integer = 0; - return; - } - - /* Reset token */ - tokenCharP = tokenStartP; - tokenTooLong = FALSE; - - /* Scan one token */ - ch = next_ch(); - do { - entry = stateP[ch]; - stateP = classActionTable[entry].nextStateP; - actionP = classActionTable[entry].actionRoutineP; - ch = (*actionP)(ch); - } while(ch != DONE); - - - /* Return results */ - tokenLength = tokenCharP - tokenStartP; -} diff --git a/nx-X11/lib/font/Type1/token.h b/nx-X11/lib/font/Type1/token.h deleted file mode 100644 index 663982889..000000000 --- a/nx-X11/lib/font/Type1/token.h +++ /dev/null @@ -1,79 +0,0 @@ -/* $Xorg: token.h,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/token.h,v 1.3 1999/08/22 08:58:54 dawes Exp $ */ - -#ifndef TOKEN_H -#define TOKEN_H - -/* Special characters */ -#define CONTROL_C (3) - -/* Token type codes */ -#define TOKEN_INVALID (-3) -#define TOKEN_BREAK (-2) -#define TOKEN_EOF (-1) -#define TOKEN_NONE (0) -#define TOKEN_LEFT_PAREN (1) -#define TOKEN_RIGHT_PAREN (2) -#define TOKEN_LEFT_ANGLE (3) -#define TOKEN_RIGHT_ANGLE (4) -#define TOKEN_LEFT_BRACE (5) -#define TOKEN_RIGHT_BRACE (6) -#define TOKEN_LEFT_BRACKET (7) -#define TOKEN_RIGHT_BRACKET (8) -#define TOKEN_NAME (9) -#define TOKEN_LITERAL_NAME (10) -#define TOKEN_INTEGER (11) -#define TOKEN_REAL (12) -#define TOKEN_RADIX_NUMBER (13) -#define TOKEN_HEX_STRING (14) -#define TOKEN_STRING (15) -#define TOKEN_IMMED_NAME (16) - -/* Token routines */ -extern void scan_token( psobj *inputP ); - -/* - * ------------------------------------------------------------------------- - * Globals shared -- (everyone else KEEP YOUR MITTS OFF THEM!) - * ------------------------------------------------------------------------- - */ - -/* These variables are set by the caller */ -extern char *tokenStartP; /* Pointer to token buffer in VM */ -extern char *tokenMaxP; /* Pointer to end of VM we may use + 1 */ - -/* These variables are set by P_TOKEN */ -extern int tokenLength; /* Characters in token */ -extern boolean tokenTooLong; /* Token too long for space available */ -extern int tokenType; /* Type of token identified */ -extern psvalue tokenValue; /* Token value */ - -#endif /* TOKEN_H */ diff --git a/nx-X11/lib/font/Type1/tokst.h b/nx-X11/lib/font/Type1/tokst.h deleted file mode 100644 index 02166afde..000000000 --- a/nx-X11/lib/font/Type1/tokst.h +++ /dev/null @@ -1,510 +0,0 @@ -/* $Xorg: tokst.h,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* $XFree86: xc/lib/font/Type1/tokst.h,v 1.3 1999/08/22 08:58:54 dawes Exp $ */ - -/* -------------------------------------- */ -/* --- MACHINE GENERATED, DO NOT EDIT --- */ -/* -------------------------------------- */ - -#ifndef TOKST -#define TOKST 1 - -/* - * State Index Tables -- - * - * These tables map the input character to the - * proper entry in the Class Action Table. - * There is one table for each state. - * - */ -#define s0 (si0+2) -static unsigned char si0[258] = { 0x10,0x11, - 0x02,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x02,0x02,0x0F,0x0F,0x02,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x02,0x0F,0x0F,0x0F,0x0F,0x03,0x0F,0x0F,0x05,0x0B,0x0F,0x0D,0x0F,0x0D,0x0E,0x04, - 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0F,0x0F,0x08,0x0F,0x0C,0x0F, - 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x0A,0x0F,0x0F, - 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,0x09,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F -}; - -#define s1 (si1+2) -static unsigned char si1[258] = { 0x14,0x15, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13, - 0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13 -}; - -#define s2 (si2+2) -static unsigned char si2[258] = { 0x1B,0x1C, - 0x16,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x16,0x16,0x1A,0x1A,0x16,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x16,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x1A,0x17,0x17,0x1A,0x1A,0x1A,0x1A,0x19,0x17, - 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1A,0x1A,0x17,0x1A,0x17,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x17,0x1A,0x17,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, - 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A -}; - -#define s3 (si3+2) -static unsigned char si3[258] = { 0x23,0x24, - 0x1D,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1D,0x1D,0x22,0x22,0x1D,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x1D,0x22,0x22,0x20,0x22,0x1E,0x22,0x22,0x1E,0x1E,0x22,0x22,0x22,0x22,0x1F,0x1E, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22, - 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1E,0x22,0x1E,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, - 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22 -}; - -#define s4 (si4+2) -static unsigned char si4[258] = { 0x29,0x2A, - 0x25,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x28,0x28,0x25,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x25,0x28,0x28,0x28,0x28,0x26,0x28,0x28,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x26, - 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x28,0x28,0x26,0x28,0x26,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x28,0x26,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28 -}; - -#define s5 (si5+2) -static unsigned char si5[258] = { 0x30,0x31, - 0x2B,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2B,0x2B,0x2F,0x2F,0x2B,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2B,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2F,0x2C,0x2C,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C, - 0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2E,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2D,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2C,0x2F,0x2C,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F, - 0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F,0x2F -}; - -#define s6 (si6+2) -static unsigned char si6[258] = { 0x36,0x37, - 0x32,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x32,0x32,0x35,0x35,0x32,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x32,0x35,0x35,0x35,0x35,0x33,0x35,0x35,0x33,0x33,0x35,0x35,0x35,0x35,0x35,0x33, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35, - 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x35,0x33,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35 -}; - -#define s7 (si7+2) -static unsigned char si7[258] = { 0x3D,0x3E, - 0x38,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x38,0x38,0x3C,0x3C,0x38,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x38,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x3C,0x39,0x39,0x3C,0x3A,0x3C,0x3A,0x3C,0x39, - 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3C,0x3C,0x39,0x3C,0x39,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x39,0x3C,0x39,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C, - 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C -}; - -#define s8 (si8+2) -static unsigned char si8[258] = { 0x43,0x44, - 0x3F,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3F,0x3F,0x42,0x42,0x3F,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x3F,0x42,0x42,0x42,0x42,0x40,0x42,0x42,0x40,0x40,0x42,0x42,0x42,0x42,0x42,0x40, - 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x42,0x42,0x40,0x42,0x40,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x42,0x40,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42 -}; - -#define s9 (si9+2) -static unsigned char si9[258] = { 0x48,0x49, - 0x45,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x45,0x45,0x47,0x47,0x45,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x45,0x47,0x47,0x47,0x47,0x46,0x47,0x47,0x46,0x46,0x47,0x47,0x47,0x47,0x47,0x46, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x46,0x47,0x46,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47, - 0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47 -}; - -#define s10 (si10+2) -static unsigned char si10[258] = { 0x4E,0x4F, - 0x4A,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4A,0x4A,0x4D,0x4D,0x4A,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4A,0x4D,0x4D,0x4D,0x4D,0x4B,0x4D,0x4D,0x4B,0x4B,0x4D,0x4D,0x4D,0x4D,0x4D,0x4B, - 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4D,0x4D,0x4B,0x4D,0x4B,0x4D, - 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, - 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, - 0x4D,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C, - 0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4C,0x4B,0x4D,0x4B,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D, - 0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D,0x4D -}; - -#define s11 (si11+2) -static unsigned char si11[258] = { 0x53,0x54, - 0x50,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x50,0x50,0x52,0x52,0x50,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x50,0x52,0x52,0x52,0x52,0x51,0x52,0x52,0x51,0x51,0x52,0x52,0x52,0x52,0x52,0x51, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x51,0x52,0x51,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52, - 0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52 -}; - -/* - * Class Action Table -- - * - * The entries in the Class Action Table indicate the - * action routine to be called, and the next state to - * enter, for each relevant character class in each. - * state. There are several entries for each state. - * - */ -static int AAH_NAME ( int ch ); -static int BREAK_SIGNAL ( int ch ); -static int HEX_STRING ( int ch ); -static int IMMED_NAME ( int ch ); -static int INTEGER ( int ch ); -static int LEFT_BRACE ( int ch ); -static int LEFT_BRACKET ( int ch ); -static int LITERAL_NAME ( int ch ); -static int NAME ( int ch ); -static int NO_TOKEN ( int ch ); -static int OOPS_NAME ( int ch ); -static int RADIX_NUMBER ( int ch ); -static int REAL ( int ch ); -static int RIGHT_ANGLE ( int ch ); -static int RIGHT_BRACE ( int ch ); -static int RIGHT_BRACKET ( int ch ); -static int RIGHT_PAREN ( int ch ); -static int STRING ( int ch ); -static int add_1st_decpt ( int ch ); -static int add_1st_digits ( int ch ); -static int add_char ( int ch ); -static int add_decpt ( int ch ); -static int add_digits ( int ch ); -static int add_exponent ( int ch ); -static int add_e_sign ( int ch ); -static int add_fraction ( int ch ); -static int add_radix ( int ch ); -static int add_r_digits ( int ch ); -static int add_sign ( int ch ); -static int next_char ( int ch ); -static int skip_comment ( int ch ); -static int skip_space ( int ch ); - -static struct cat { - int (*actionRoutineP)(int); - unsigned char *nextStateP; -} classActionTable[] = { - - /* s0: Classify initial character */ - /* 00 ALPHA */ {NAME, s0}, /* executable name */ - /* 01 DIGIT */ {add_1st_digits, s3}, /* number? */ - /* 02 WHITE_SPACE */ {skip_space, s0}, /* skip white space */ - /* 03 PERCENT */ {skip_comment, s0}, /* comment? */ - /* 04 SLASH */ {next_char, s1}, /* literal or imm name */ - /* 05 LEFT_PAREN */ {STRING, s0}, /* string */ - /* 06 LEFT_BRACE */ {LEFT_BRACE, s0}, /* begin procedure body */ - /* 07 LEFT_BRACKET */ {LEFT_BRACKET, s0}, /* begin array */ - /* 08 LEFT_ANGLE */ {HEX_STRING, s0}, /* hex string? */ - /* 09 RIGHT_BRACE */ {RIGHT_BRACE, s0}, /* end procedure body */ - /* 0A RIGHT_BRACKET */ {RIGHT_BRACKET, s0}, /* end array */ - /* 0B RIGHT_PAREN */ {RIGHT_PAREN, s0}, /* unmatched right paren */ - /* 0C RIGHT_ANGLE */ {RIGHT_ANGLE, s0}, /* unmatched right angle */ - /* 0D SIGN */ {add_sign, s2}, /* signed number? */ - /* 0E DECIMAL_POINT */ {add_1st_decpt, s4}, /* real number? */ - /* 0F ANY */ {NAME, s0}, /* executable name */ - /* 10 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 11 EOF */ {NO_TOKEN, s0}, /* no token found */ - - /* s1: Further classify a '/' */ - /* 12 SLASH */ {IMMED_NAME, s0}, /* immediate name */ - /* 13 ANY */ {LITERAL_NAME, s0}, /* literal name */ - /* 14 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 15 EOF */ {OOPS_NAME, s0}, /* isolated sign */ - - /* s2: sign */ - /* 16 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated sign */ - /* 17 SPECIAL */ {OOPS_NAME, s0}, /* isolated sign */ - /* 18 DIGIT */ {add_digits, s3}, /* number? */ - /* 19 DECIMAL_POINT */ {add_decpt, s4}, /* real number? */ - /* 1A ANY */ {NAME, s0}, /* executable name */ - /* 1B BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 1C EOF */ {OOPS_NAME, s0}, /* isolated sign */ - - /* s3: sign? digit+ */ - /* 1D WHITE_SPACE */ {INTEGER, s0}, /* n-digit integer */ - /* 1E SPECIAL */ {INTEGER, s0}, /* n-digit integer */ - /* 1F DECIMAL_POINT */ {add_char, s5}, /* real number? */ - /* 20 POUND */ {add_radix, s10}, /* radix number? */ - /* 21 eE */ {add_char, s7}, /* real with exponent? */ - /* 22 ANY */ {AAH_NAME, s0}, /* executable name */ - /* 23 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 24 EOF */ {INTEGER, s0}, /* n-digit integer */ - - /* s4: sign? . */ - /* 25 WHITE_SPACE */ {OOPS_NAME, s0}, /* isolated +. or -. */ - /* 26 SPECIAL */ {OOPS_NAME, s0}, /* isolated +. or -. */ - /* 27 DIGIT */ {add_fraction, s6}, /* number? */ - /* 28 ANY */ {NAME, s0}, /* executable name */ - /* 29 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 2A EOF */ {OOPS_NAME, s0}, /* isolated +. or -. */ - - /* s5: sign? digit+ . */ - /* 2B WHITE_SPACE */ {REAL, s0}, /* real with fraction */ - /* 2C SPECIAL */ {REAL, s0}, /* real with fraction */ - /* 2D eE */ {add_char, s7}, /* real with exponent? */ - /* 2E DIGIT */ {add_fraction, s6}, /* number? */ - /* 2F ANY */ {AAH_NAME, s0}, /* executable name */ - /* 30 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 31 EOF */ {REAL, s0}, /* real with fraction */ - - /* s6: sign? (digit+ . digit+) | (. digit+) */ - /* 32 WHITE_SPACE */ {REAL, s0}, /* real with fraction */ - /* 33 SPECIAL */ {REAL, s0}, /* real with fraction */ - /* 34 eE */ {add_char, s7}, /* real with exponent? */ - /* 35 ANY */ {AAH_NAME, s0}, /* executable name */ - /* 36 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 37 EOF */ {REAL, s0}, /* real with fraction */ - - /* s7: sign? ((digit+ (. digit*)?) | (. digit+)) Ee */ - /* 38 WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ - /* 39 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ - /* 3A SIGN */ {add_e_sign, s8}, /* real w signed exponent? */ - /* 3B DIGIT */ {add_exponent, s9}, /* real w exponent ? */ - /* 3C ANY */ {AAH_NAME, s0}, /* executable name */ - /* 3D BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 3E EOF */ {OOPS_NAME, s0}, /* invalid real number */ - - /* s8: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign */ - /* 3F WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid real number */ - /* 40 SPECIAL */ {OOPS_NAME, s0}, /* invalid real number */ - /* 41 DIGIT */ {add_exponent, s9}, /* real w exponent? */ - /* 42 ANY */ {AAH_NAME, s0}, /* executable name */ - /* 43 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 44 EOF */ {OOPS_NAME, s0}, /* invalid real number */ - - /* s9: sign? (digit+ (. digit*)? | (digit* . digit+) Ee sign? digit+ */ - /* 45 WHITE_SPACE */ {REAL, s0}, /* real w exponent */ - /* 46 SPECIAL */ {REAL, s0}, /* real w exponent */ - /* 47 ANY */ {AAH_NAME, s0}, /* executable name */ - /* 48 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 49 EOF */ {REAL, s0}, /* real w exponent */ - - /* s10: digit+ # */ - /* 4A WHITE_SPACE */ {OOPS_NAME, s0}, /* invalid radix number */ - /* 4B SPECIAL */ {OOPS_NAME, s0}, /* invalid radix number */ - /* 4C R_DIGIT */ {add_r_digits, s11}, /* radix number? */ - /* 4D ANY */ {AAH_NAME, s0}, /* executable name */ - /* 4E BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 4F EOF */ {OOPS_NAME, s0}, /* invalid radix number */ - - /* s11: digit+ # r_digit+ */ - /* 50 WHITE_SPACE */ {RADIX_NUMBER, s0}, /* radix number */ - /* 51 SPECIAL */ {RADIX_NUMBER, s0}, /* radix number */ - /* 52 ANY */ {AAH_NAME, s0}, /* executable name */ - /* 53 BREAK */ {BREAK_SIGNAL, s0}, /* break signalled */ - /* 54 EOF */ {RADIX_NUMBER, s0} /* radix number */ -}; - -/* - * Character Classification Tables -- - * - * The entries in the Character Classification Tables - * map character codes to character classes. The - * tables contains one entry per code. The bits in - * each entry indicate which classes the character - * code belongs to. - * - * The macros 'isInCLASS(ch)' generate code to test - * whether 'ch' is a character in 'CLASS'. - * - */ -/* Membership macros for classes defined in table 1 ... */ -#define isRADIX_DIGIT(c) ((isInP1[c] & 0x80) != 0) -#define isHEX_DIGIT(c) ((isInP1[c] & 0x40) != 0) -#define isDECIMAL_DIGIT(c) ((isInP1[c] & 0x10) != 0) -#define isOCTAL_DIGIT(c) ((isInP1[c] & 0x20) != 0) - -/* Membership macros for classes defined in table 2 ... */ -#define isWHITE_SPACE(c) ((isInP2[c] & 0x80) != 0) -#define isCOMMENT(c) ((isInP2[c] & 0x40) != 0) -#define isNAME(c) ((isInP2[c] & 0x20) != 0) -#define isSTRING_SPECIAL(c) ((isInP2[c] & 0x10) != 0) -#define isNUMBER_ENDER(c) ((isInP2[c] & 0x08) != 0) - -#define isInP1 (isInT1+2) -static unsigned char isInT1[258] = { 0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xD0,0xD0,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00, - 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -}; - -#define isInP2 (isInT2+2) -static unsigned char isInT2[258] = { 0x18,0x18, - 0xC8,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC8,0x88,0x60,0x60,0x98,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0xC8,0x60,0x60,0x60,0x60,0x48,0x60,0x60,0x58,0x58,0x60,0x60,0x60,0x60,0x60,0x48, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x70,0x48,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x48,0x60,0x48,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, - 0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60 -}; - -#endif diff --git a/nx-X11/lib/font/Type1/trig.h b/nx-X11/lib/font/Type1/trig.h deleted file mode 100644 index d569ed067..000000000 --- a/nx-X11/lib/font/Type1/trig.h +++ /dev/null @@ -1,41 +0,0 @@ -/* $Xorg: trig.h,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/*SHARED*/ - -/* $XFree86: xc/lib/font/Type1/trig.h,v 1.2 1998/07/25 06:57:00 dawes Exp $ */ - -#undef DegreeCos -#undef DegreeSin -#undef sqrt - -#define DegreeCos(d) xiStub() -#define DegreeSin(d) xiStub() -#define sqrt(d) xiStub() - diff --git a/nx-X11/lib/font/Type1/type1.c b/nx-X11/lib/font/Type1/type1.c deleted file mode 100644 index b3fa4965a..000000000 --- a/nx-X11/lib/font/Type1/type1.c +++ /dev/null @@ -1,1892 +0,0 @@ -/* $Xorg: type1.c,v 1.4 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines, Corp. 1991 - * All Rights Reserved - * Copyright Lexmark International, Inc. 1991 - * All Rights Reserved - * Portions Copyright (c) 1990 Adobe Systems Incorporated. - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, - * 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 IBM or Lexmark or Adobe - * not be used in advertising or publicity pertaining to distribution of - * the software without specific, written prior permission. - * - * IBM, LEXMARK, AND ADOBE PROVIDE THIS SOFTWARE "AS IS", WITHOUT ANY - * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE - * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE, INCLUDING - * ANY DUTY TO SUPPORT OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY - * PORTION OF THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM, - * LEXMARK, OR ADOBE) ASSUMES THE ENTIRE COST OF ALL SERVICING, REPAIR AND - * CORRECTION. IN NO EVENT SHALL IBM, LEXMARK, OR ADOBE 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/type1.c,v 1.9tsi Exp $ */ - -/*********************************************************************/ -/* */ -/* Type 1 module - Converting fonts in Adobe Type 1 Font Format */ -/* to scaled and hinted paths for rasterization. */ -/* Files: type1.c, type1.h, and blues.h. */ -/* */ -/* Authors: Sten F. Andler, IBM Almaden Research Center */ -/* (Type 1 interpreter, stem & flex hints) */ -/* */ -/* Patrick A. Casey, Lexmark International, Inc. */ -/* (Font level hints & stem hints) */ -/* */ -/*********************************************************************/ - -/******************/ -/* Include Files: */ -/******************/ -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include /* a system-dependent include, usually */ -#include -#else -#include "Xdefs.h" -#include "Xmd.h" -#include "xf86_ansic.h" -#endif -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "fonts.h" /* understands about TEXTTYPEs */ -#include "pictures.h" /* understands about handles */ -#include "range.h" - -typedef struct xobject xobject; -#include "util.h" /* PostScript objects */ -#include "fontfcn.h" -#include "blues.h" /* Blues structure for font-level hints */ - -/**********************************/ -/* Type1 Constants and Structures */ -/**********************************/ -#define MAXSTACK 24 /* Adobe Type1 limit */ -#define MAXCALLSTACK 10 /* Adobe Type1 limit */ -#define MAXPSFAKESTACK 32 /* Max depth of fake PostScript stack (local) */ -#define MAXSTRLEN 512 /* Max length of a Type 1 string (local) */ -#define MAXLABEL 256 /* Maximum number of new hints */ -#if XFONT_CID -#define MAXSTEMS 500 /* Maximum number of VSTEM and HSTEM hints */ -#else -#define MAXSTEMS 128 /* Maximum number of VSTEM and HSTEM hints */ -#endif -#define EPS 0.001 /* Small number for comparisons */ - -/************************************/ -/* Adobe Type 1 CharString commands */ -/************************************/ -#define HSTEM 1 -#define VSTEM 3 -#define VMOVETO 4 -#define RLINETO 5 -#define HLINETO 6 -#define VLINETO 7 -#define RRCURVETO 8 -#define CLOSEPATH 9 -#define CALLSUBR 10 -#define RETURN 11 -#define ESCAPE 12 -#define HSBW 13 -#define ENDCHAR 14 -#define RMOVETO 21 -#define HMOVETO 22 -#define VHCURVETO 30 -#define HVCURVETO 31 - -/*******************************************/ -/* Adobe Type 1 CharString Escape commands */ -/*******************************************/ -#define DOTSECTION 0 -#define VSTEM3 1 -#define HSTEM3 2 -#define SEAC 6 -#define SBW 7 -#define DIV 12 -#define CALLOTHERSUBR 16 -#define POP 17 -#define SETCURRENTPOINT 33 - -/*****************/ -/* Useful macros */ -/*****************/ - -#define FABS(x) fabs(x) - -#define CEIL(x) ceil(x) - -#define FLOOR(x) floor(x) - -#define ROUND(x) FLOOR((x) + 0.5) - -#define ODD(x) (((int)(x)) & 01) - -#define Error {errflag = TRUE; return;} -#define ErrorRet(ret) {errflag = TRUE; return (ret);} - -/********************/ -/* global variables */ -/********************/ -struct stem { /* representation of a STEM hint */ - int vertical; /* TRUE if vertical, FALSE otherwise */ - double x, dx; /* interval of vertical stem */ - double y, dy; /* interval of horizontal stem */ - struct segment *lbhint, *lbrevhint; /* left or bottom hint adjustment */ - struct segment *rthint, *rtrevhint; /* right or top hint adjustment */ -}; - -struct xobject *Type1Char(char *env, struct XYspace *S, - psobj *charstrP, psobj *subrsP, psobj *osubrsP, - struct blues_struct *bluesP, int *modeP); -#if XFONT_CID -struct xobject *CIDChar(char *env, struct XYspace *S, - psobj *charstrP, psobj *subrsP, psobj *osubrsP, - struct blues_struct *bluesP, int *modeP); -#endif - -static double escapementX, escapementY; -static double sidebearingX, sidebearingY; -static double accentoffsetX, accentoffsetY; - -static struct segment *path; -static int errflag; - -/*************************************************/ -/* Global variables to hold Type1Char parameters */ -/*************************************************/ -static char *Environment; -static struct XYspace *CharSpace; -static psobj *CharStringP, *SubrsP; - -/************************/ -/* Forward declarations */ -/************************/ -static struct segment *Applyhint ( struct segment *p, int stemnumber, - int half ); -static struct segment *Applyrevhint ( struct segment *p, int stemnumber, - int half ); -static void CallOtherSubr ( int othersubrno ); -static void CallSubr ( int subrno ); -static struct segment *CenterStem ( double edge1, double edge2 ); -static void ClearCallStack ( void ); -static void ClearPSFakeStack ( void ); -static void ClearStack ( void ); -static void ComputeAlignmentZones ( void ); -static void ComputeStem ( int stemno ); -static void Decode ( int Code ); -static unsigned char Decrypt ( unsigned char cipher ); -static double Div ( double num1, double num2 ); -static void DoClosePath ( void ); -static void DoCommand ( int Code ); -static int DoRead ( int *CodeP ); -static void DotSection ( void ); -static void EndChar ( void ); -static void Escape ( int Code ); -static struct segment *FindStems ( double x, double y, double dx, double dy ); -static void FinitStems ( void ); -static void FlxProc ( double c1x2, double c1y2, double c3x0, double c3y0, - double c3x1, double c3y1, double c3x2, double c3y2, - double c4x0, double c4y0, double c4x1, double c4y1, - double c4x2, double c4y2, double epY, double epX, - int idmin ); -static void FlxProc1 ( void ); -static void FlxProc2 ( void ); -static void HintReplace ( void ); -static void HStem ( double y, double dy ); -static void InitStems ( void ); -static void PopCall ( psobj **CurrStrPP, int *CurrIndexP, - unsigned short *CurrKeyP ); -static double PSFakePop ( void ); -static void PSFakePush ( double Num ); -static void Push ( double Num ); -static void PushCall ( psobj *CurrStrP, int CurrIndex, - unsigned short CurrKey ); -static void Return ( void ); -static void RLineTo ( double dx, double dy ); -static void RMoveTo ( double dx, double dy ); -static void RRCurveTo ( double dx1, double dy1, double dx2, double dy2, - double dx3, double dy3 ); -static void Sbw ( double sbx, double sby, double wx, double wy ); -static void Seac ( double asb, double adx, double ady, unsigned char bchar, - unsigned char achar ); -static void SetCurrentPoint ( double x, double y ); -static void StartDecrypt ( void ); -static void VStem ( double x, double dx ); - -/*****************************************/ -/* statics for Flex procedures (FlxProc) */ -/*****************************************/ -static struct segment *FlxOldPath; /* save path before Flex feature */ - -/******************************************************/ -/* statics for Font level hints (Blues) (see blues.h) */ -/******************************************************/ -static struct blues_struct *blues; /* the blues structure */ -static struct alignmentzone alignmentzones[MAXALIGNMENTZONES]; -static int numalignmentzones; /* total number of alignment zones */ - -/****************************************************************/ -/* Subroutines for the Font level hints (Alignment zones, etc.) */ -/****************************************************************/ - -/******************************************/ -/* Fill in the alignment zone structures. */ -/******************************************/ -static void -ComputeAlignmentZones(void) -{ - int i; - double dummy, bluezonepixels, familyzonepixels; - struct segment *p; - - numalignmentzones = 0; /* initialize total # of zones */ - - /* do the BlueValues zones */ - for (i = 0; i < blues->numBlueValues; i +=2, ++numalignmentzones) { - /* the 0th & 1st numbers in BlueValues are for a bottom zone */ - /* the rest are topzones */ - if (i == 0) /* bottom zone */ - alignmentzones[numalignmentzones].topzone = FALSE; - else /* top zone */ - alignmentzones[numalignmentzones].topzone = TRUE; - if (i < blues->numFamilyBlues) { /* we must consider FamilyBlues */ - p = ILoc(CharSpace,0,blues->BlueValues[i] - blues->BlueValues[i+1]); - QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); - Destroy(p); - p = ILoc(CharSpace,0,blues->FamilyBlues[i]-blues->FamilyBlues[i+1]); - QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); - Destroy(p); - /* is the difference in size of the zones less than 1 pixel? */ - if (FABS(bluezonepixels - familyzonepixels) < 1.0) { - /* use the Family zones */ - alignmentzones[numalignmentzones].bottomy = - blues->FamilyBlues[i]; - alignmentzones[numalignmentzones].topy = - blues->FamilyBlues[i+1]; - continue; - } - } - /* use this font's Blue zones */ - alignmentzones[numalignmentzones].bottomy = blues->BlueValues[i]; - alignmentzones[numalignmentzones].topy = blues->BlueValues[i+1]; - } - - /* do the OtherBlues zones */ - for (i = 0; i < blues->numOtherBlues; i +=2, ++numalignmentzones) { - /* all of the OtherBlues zones are bottom zones */ - alignmentzones[numalignmentzones].topzone = FALSE; - if (i < blues->numFamilyOtherBlues) {/* consider FamilyOtherBlues */ - p = ILoc(CharSpace,0,blues->OtherBlues[i] - blues->OtherBlues[i+1]); - QueryLoc(p, IDENTITY, &dummy, &bluezonepixels); - Destroy(p); - p = ILoc(CharSpace,0,blues->FamilyOtherBlues[i] - - blues->FamilyOtherBlues[i+1]); - QueryLoc(p, IDENTITY, &dummy, &familyzonepixels); - Destroy(p); - /* is the difference in size of the zones less than 1 pixel? */ - if (FABS(bluezonepixels - familyzonepixels) < 1.0) { - /* use the Family zones */ - alignmentzones[numalignmentzones].bottomy = - blues->FamilyOtherBlues[i]; - alignmentzones[numalignmentzones].topy = - blues->FamilyOtherBlues[i+1]; - continue; - } - } - /* use this font's Blue zones (as opposed to the Family Blues */ - alignmentzones[numalignmentzones].bottomy = blues->OtherBlues[i]; - alignmentzones[numalignmentzones].topy = blues->OtherBlues[i+1]; - } -} - -/**********************************************************************/ -/* Subroutines and statics for handling of the VSTEM and HSTEM hints. */ -/**********************************************************************/ -static int InDotSection; /* DotSection flag */ -static struct stem stems[MAXSTEMS]; /* All STEM hints */ -static int numstems; /* Number of STEM hints */ -static int currstartstem; /* The current starting stem. */ -static int oldvert, oldhor; /* Remember hint in effect */ -static int oldhorhalf, oldverthalf; /* Remember which half of the stem */ -static double wsoffsetX, wsoffsetY; /* White space offset - for VSTEM3,HSTEM3 */ -static int wsset; /* Flag for whether we've set wsoffsetX,Y */ - -static void -InitStems(void) /* Initialize the STEM hint data structures */ -{ - InDotSection = FALSE; - currstartstem = numstems = 0; - oldvert = oldhor = -1; -} - -static void -FinitStems(void) /* Terminate the STEM hint data structures */ -{ - int i; - - for (i = 0; i < numstems; i++) { - Destroy(stems[i].lbhint); - Destroy(stems[i].lbrevhint); - Destroy(stems[i].rthint); - Destroy(stems[i].rtrevhint); - } -} - -/*******************************************************************/ -/* Compute the dislocation that a stemhint should cause for points */ -/* inside the stem. */ -/*******************************************************************/ -static void -ComputeStem(int stemno) -{ - int verticalondevice, idealwidth; - double stemstart, stemwidth; - struct segment *p; - int i; - double stembottom, stemtop, flatposition; - double Xpixels, Ypixels; - double unitpixels, onepixel; - int suppressovershoot, enforceovershoot; - double stemshift, flatpospixels, overshoot; - double widthdiff; /* Number of character space units to adjust width */ - double lbhintvalue, rthintvalue; - double cxx, cyx, cxy, cyy; /* Transformation matrix */ - int rotated; /* TRUE if character is on the side, FALSE if upright */ - - /************************************************/ - /* DETERMINE ORIENTATION OF CHARACTER ON DEVICE */ - /************************************************/ - - QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ - - if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) - rotated = TRUE; /* Char is on side (90 or 270 degrees), possibly oblique. */ - else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) - rotated = FALSE; /* Char is upright (0 or 180 degrees), possibly oblique. */ - else { - stems[stemno].lbhint = NULL; /* Char is at non-axial angle, ignore hints. */ - stems[stemno].lbrevhint = NULL; - stems[stemno].rthint = NULL; - stems[stemno].rtrevhint = NULL; - return; - } - - /* Determine orientation of stem */ - - if (stems[stemno].vertical) { - verticalondevice = !rotated; - stemstart = stems[stemno].x; - stemwidth = stems[stemno].dx; - } else { - verticalondevice = rotated; - stemstart = stems[stemno].y; - stemwidth = stems[stemno].dy; - } - - /* Determine how many pixels (non-negative) correspond to 1 character space - unit (unitpixels), and how many character space units (non-negative) - correspond to one pixel (onepixel). */ - - if (stems[stemno].vertical) - p = ILoc(CharSpace, 1, 0); - else - p = ILoc(CharSpace, 0, 1); - QueryLoc(p, IDENTITY, &Xpixels, &Ypixels); - Destroy(p); - if (verticalondevice) - unitpixels = FABS(Xpixels); - else - unitpixels = FABS(Ypixels); - - onepixel = 1.0 / unitpixels; - - /**********************/ - /* ADJUST STEM WIDTHS */ - /**********************/ - - widthdiff = 0.0; - - /* Find standard stem with smallest width difference from this stem */ - if (stems[stemno].vertical) { /* vertical stem */ - if (blues->StdVW != 0) /* there is an entry for StdVW */ - widthdiff = blues->StdVW - stemwidth; - for (i = 0; i < blues->numStemSnapV; ++i) { /* now look at StemSnapV */ - if (blues->StemSnapV[i] - stemwidth < widthdiff) - /* this standard width is the best match so far for this stem */ - widthdiff = blues->StemSnapV[i] - stemwidth; - } - } else { /* horizontal stem */ - if (blues->StdHW != 0) /* there is an entry for StdHW */ - widthdiff = blues->StdHW - stemwidth; - for (i = 0; i < blues->numStemSnapH; ++i) { /* now look at StemSnapH */ - if (blues->StemSnapH[i] - stemwidth < widthdiff) - /* this standard width is the best match so far for this stem */ - widthdiff = blues->StemSnapH[i] - stemwidth; - } - } - - /* Only expand or contract stems if they differ by less than 1 pixel from - the closest standard width, otherwise make the width difference = 0. */ - if (FABS(widthdiff) > onepixel) - widthdiff = 0.0; - - /* Expand or contract stem to the nearest integral number of pixels. */ - idealwidth = ROUND((stemwidth + widthdiff) * unitpixels); - /* Ensure that all stems are at least one pixel wide. */ - if (idealwidth == 0) - idealwidth = 1; - /* Apply ForceBold to vertical stems. */ - if (blues->ForceBold && stems[stemno].vertical) - /* Force this vertical stem to be at least DEFAULTBOLDSTEMWIDTH wide. */ - if (idealwidth < DEFAULTBOLDSTEMWIDTH) - idealwidth = DEFAULTBOLDSTEMWIDTH; - /* Now compute the number of character space units necessary */ - widthdiff = idealwidth * onepixel - stemwidth; - - /*********************************************************************/ - /* ALIGNMENT ZONES AND OVERSHOOT SUPPRESSION - HORIZONTAL STEMS ONLY */ - /*********************************************************************/ - - stemshift = 0.0; - - if (!stems[stemno].vertical) { - - /* Get bottom and top boundaries of the stem. */ - stembottom = stemstart; - stemtop = stemstart + stemwidth; - - /* Find out if this stem intersects an alignment zone (the BlueFuzz */ - /* entry in the Private dictionary specifies the number of character */ - /* units to extend (in both directions) the effect of an alignment */ - /* zone on a horizontal stem. The default value of BlueFuzz is 1. */ - for (i = 0; i < numalignmentzones; ++i) { - if (alignmentzones[i].topzone) { - if (stemtop >= alignmentzones[i].bottomy && - stemtop <= alignmentzones[i].topy + blues->BlueFuzz) { - break; /* We found a top-zone */ - } - } else { - if (stembottom <= alignmentzones[i].topy && - stembottom >= alignmentzones[i].bottomy - blues->BlueFuzz) { - break; /* We found a bottom-zone */ - } - } - } - - if (i < numalignmentzones) { /* We found an intersecting zone (number i). */ - suppressovershoot = FALSE; - enforceovershoot = FALSE; - - /* When 1 character space unit is rendered smaller than BlueScale - device units (pixels), we must SUPPRESS overshoots. Otherwise, - if the top (or bottom) of this stem is more than BlueShift character - space units away from the flat position, we must ENFORCE overshoot. */ - - if (unitpixels < blues->BlueScale) - suppressovershoot = TRUE; - else - if (alignmentzones[i].topzone) { - if (stemtop >= alignmentzones[i].bottomy + blues->BlueShift) - enforceovershoot = TRUE; - } else - if (stembottom <= alignmentzones[i].topy - blues->BlueShift) - enforceovershoot = TRUE; - - /*************************************************/ - /* ALIGN THE FLAT POSITION OF THE ALIGNMENT ZONE */ - /*************************************************/ - - /* Compute the position of the alignment zone's flat position in - device space and the amount of shift needed to align it on a - pixel boundary. Move all stems this amount. */ - - if (alignmentzones[i].topzone) - flatposition = alignmentzones[i].bottomy; - else - flatposition = alignmentzones[i].topy; - - /* Find the flat position in pixels */ - flatpospixels = flatposition * unitpixels; - - /* Find the stem shift necessary to align the flat - position on a pixel boundary, and use this shift for all stems */ - stemshift = (ROUND(flatpospixels) - flatpospixels) * onepixel; - - /************************************************/ - /* HANDLE OVERSHOOT ENFORCEMENT AND SUPPRESSION */ - /************************************************/ - - /* Compute overshoot amount (non-negative) */ - if (alignmentzones[i].topzone) - overshoot = stemtop - flatposition; - else - overshoot = flatposition - stembottom; - - if (overshoot > 0.0) { - /* ENFORCE overshoot by shifting the entire stem (if necessary) so that - it falls at least one pixel beyond the flat position. */ - - if (enforceovershoot) - if (overshoot < onepixel) { - if (alignmentzones[i].topzone) - stemshift += onepixel - overshoot; - else - stemshift -= onepixel - overshoot; - } - /* SUPPRESS overshoot by aligning the stem to the alignment zone's - flat position. */ - - if (suppressovershoot) { - if (alignmentzones[i].topzone) - stemshift -= overshoot; - else - stemshift += overshoot; - } - } - - /************************************************************/ - /* COMPUTE HINT VALUES FOR EACH SIDE OF THE HORIZONTAL STEM */ - /************************************************************/ - - /* If the stem was aligned by a topzone, we expand or contract the stem - only at the bottom - since the stem top was aligned by the zone. - If the stem was aligned by a bottomzone, we expand or contract the stem - only at the top - since the stem bottom was aligned by the zone. */ - if (alignmentzones[i].topzone) { - lbhintvalue = stemshift - widthdiff; /* bottom */ - rthintvalue = stemshift; /* top */ - } else { - lbhintvalue = stemshift; /* bottom */ - rthintvalue = stemshift + widthdiff; /* top */ - } - - stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue)); - stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue)); - stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue)); - stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue)); - - return; - - } /* endif (i < numalignmentzones) */ - - /* We didn't find any alignment zones intersecting this stem, so - proceed with normal stem alignment below. */ - - } /* endif (!stems[stemno].vertical) */ - - /* Align stem with pixel boundaries on device */ - stemstart = stemstart - widthdiff / 2; - stemshift = ROUND(stemstart * unitpixels) * onepixel - stemstart; - - /* Adjust the boundaries of the stem */ - lbhintvalue = stemshift - widthdiff / 2; /* left or bottom */ - rthintvalue = stemshift + widthdiff / 2; /* right or top */ - - if (stems[stemno].vertical) { - stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, lbhintvalue, 0.0)); - stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, -lbhintvalue, 0.0)); - stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, rthintvalue, 0.0)); - stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, -rthintvalue, 0.0)); - } else { - stems[stemno].lbhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, lbhintvalue)); - stems[stemno].lbrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -lbhintvalue)); - stems[stemno].rthint = (struct segment *)Permanent(Loc(CharSpace, 0.0, rthintvalue)); - stems[stemno].rtrevhint = (struct segment *)Permanent(Loc(CharSpace, 0.0, -rthintvalue)); - } -} - -#define LEFT 1 -#define RIGHT 2 -#define BOTTOM 3 -#define TOP 4 - -/*********************************************************************/ -/* Adjust a point using the given stem hint. Use the left/bottom */ -/* hint value or the right/top hint value depending on where the */ -/* point lies in the stem. */ -/*********************************************************************/ -static struct segment * -Applyhint(struct segment *p, int stemnumber, int half) -{ - if (half == LEFT || half == BOTTOM) - return Join(p, stems[stemnumber].lbhint); /* left or bottom hint */ - else - return Join(p, stems[stemnumber].rthint); /* right or top hint */ -} - -/*********************************************************************/ -/* Adjust a point using the given reverse hint. Use the left/bottom */ -/* hint value or the right/top hint value depending on where the */ -/* point lies in the stem. */ -/*********************************************************************/ -static struct segment * -Applyrevhint(struct segment *p, int stemnumber, int half) -{ - if (half == LEFT || half == BOTTOM) - return Join(p, stems[stemnumber].lbrevhint); /* left or bottom hint */ - else - return Join(p, stems[stemnumber].rtrevhint); /* right or top hint */ -} - -/***********************************************************************/ -/* Find the vertical and horizontal stems that the current point */ -/* (x, y) may be involved in. At most one horizontal and one vertical */ -/* stem can apply to a single point, since there are no overlaps */ -/* allowed. */ -/* The actual hintvalue is returned as a location. */ -/* Hints are ignored inside a DotSection. */ -/***********************************************************************/ -static struct segment * -FindStems(double x, double y, double dx, double dy) -{ - int i; - int newvert, newhor; - struct segment *p; - int newhorhalf, newverthalf; - - if (InDotSection) return(NULL); - - newvert = newhor = -1; - newhorhalf = newverthalf = -1; - - for (i = currstartstem; i < numstems; i++) { - if (stems[i].vertical) { /* VSTEM hint */ - if ((x >= stems[i].x - EPS) && - (x <= stems[i].x+stems[i].dx + EPS)) { - newvert = i; - if (dy != 0.0) { - if (dy < 0) newverthalf = LEFT; - else newverthalf = RIGHT; - } else { - if (x < stems[i].x+stems[i].dx / 2) newverthalf = LEFT; - else newverthalf = RIGHT; - } - } - } else { /* HSTEM hint */ - if ((y >= stems[i].y - EPS) && - (y <= stems[i].y+stems[i].dy + EPS)) { - newhor = i; - if (dx != 0.0) { - if (dx < 0) newhorhalf = TOP; - else newhorhalf = BOTTOM; - } else { - if (y < stems[i].y+stems[i].dy / 2) newhorhalf = BOTTOM; - else newhorhalf = TOP; - } - } - } - } - - p = NULL; - - if (newvert == -1 && oldvert == -1) ; /* Outside of any hints */ - else if (newvert == oldvert && - newverthalf == oldverthalf); /* No hint change */ - else if (oldvert == -1) { /* New vertical hint in effect */ - p = Applyhint(p, newvert, newverthalf); - } else if (newvert == -1) { /* Old vertical hint no longer in effect */ - p = Applyrevhint(p, oldvert, oldverthalf); - } else { /* New vertical hint in effect, old hint no longer in effect */ - p = Applyrevhint(p, oldvert, oldverthalf); - p = Applyhint(p, newvert, newverthalf); - } - - if (newhor == -1 && oldhor == -1) ; /* Outside of any hints */ - else if (newhor == oldhor && - newhorhalf == oldhorhalf) ; /* No hint change */ - else if (oldhor == -1) { /* New horizontal hint in effect */ - p = Applyhint(p, newhor, newhorhalf); - } else if (newhor == -1) { /* Old horizontal hint no longer in effect */ - p = Applyrevhint(p, oldhor, oldhorhalf); - } - else { /* New horizontal hint in effect, old hint no longer in effect */ - p = Applyrevhint(p, oldhor, oldhorhalf); - p = Applyhint(p, newhor, newhorhalf); - } - - oldvert = newvert; oldverthalf = newverthalf; - oldhor = newhor; oldhorhalf = newhorhalf; - - return p; -} - -/******************************************************/ -/* Subroutines and statics for the Type1Char routines */ -/******************************************************/ - -static int strindex; /* index into PostScript string being interpreted */ -static double currx, curry; /* accumulated x and y values for hints */ - -struct callstackentry { - psobj *currstrP; /* current CharStringP */ - int currindex; /* current strindex */ - unsigned short currkey; /* current decryption key */ - }; - -static double Stack[MAXSTACK]; -static int Top; -static struct callstackentry CallStack[MAXCALLSTACK]; -static int CallTop; -static double PSFakeStack[MAXPSFAKESTACK]; -static int PSFakeTop; - -static void -ClearStack(void) -{ - Top = -1; -} - -static void -Push(double Num) -{ - if (++Top < MAXSTACK) Stack[Top] = Num; - else Error; -} - -static void -ClearCallStack(void) -{ - CallTop = -1; -} - -static void -PushCall(psobj *CurrStrP, int CurrIndex, unsigned short CurrKey) -{ - if (++CallTop < MAXCALLSTACK) { - CallStack[CallTop].currstrP = CurrStrP; /* save CharString pointer */ - CallStack[CallTop].currindex = CurrIndex; /* save CharString index */ - CallStack[CallTop].currkey = CurrKey; /* save decryption key */ - } - else Error; -} - -static void -PopCall(psobj **CurrStrPP, int *CurrIndexP, unsigned short *CurrKeyP) -{ - if (CallTop >= 0) { - *CurrStrPP = CallStack[CallTop].currstrP; /* restore CharString pointer */ - *CurrIndexP = CallStack[CallTop].currindex; /* restore CharString index */ - *CurrKeyP = CallStack[CallTop--].currkey; /* restore decryption key */ - } - else Error; -} - -static void -ClearPSFakeStack(void) -{ - PSFakeTop = -1; -} - -/* PSFakePush: Pushes a number onto the fake PostScript stack */ -static void -PSFakePush(double Num) -{ - if (++PSFakeTop < MAXPSFAKESTACK) PSFakeStack[PSFakeTop] = Num; - else Error; -} - -/* PSFakePop: Removes a number from the top of the fake PostScript stack */ -static double -PSFakePop (void) -{ - if (PSFakeTop >= 0) return(PSFakeStack[PSFakeTop--]); - else ErrorRet(0.0); - /*NOTREACHED*/ -} - -/***********************************************************************/ -/* Center a stem on the pixel grid -- used by HStem3 and VStem3 */ -/***********************************************************************/ -static struct segment * -CenterStem(double edge1, double edge2) -{ - int idealwidth, verticalondevice; - double leftx, lefty, rightx, righty, center, width; - double widthx, widthy; - double shift, shiftx, shifty; - double Xpixels, Ypixels; - struct segment *p; - - p = Loc(CharSpace, edge1, 0.0); - QueryLoc(p, IDENTITY, &leftx, &lefty); - - p = Join(p, Loc(CharSpace, edge2, 0.0)); - QueryLoc(p, IDENTITY, &rightx, &righty); - Destroy(p); - - widthx = FABS(rightx - leftx); - widthy = FABS(righty - lefty); - - if (widthy <= EPS) { /* verticalondevice hint */ - verticalondevice = TRUE; - center = (rightx + leftx) / 2.0; - width = widthx; - } - else if (widthx <= EPS) { /* horizontal hint */ - verticalondevice = FALSE; - center = (righty + lefty) / 2.0; - width = widthy; - } - else { /* neither horizontal nor verticalondevice and not oblique */ - return (NULL); - } - - idealwidth = ROUND(width); - if (idealwidth == 0) idealwidth = 1; - if (ODD(idealwidth)) { /* is ideal width odd? */ - /* center stem over pixel */ - shift = FLOOR(center) + 0.5 - center; - } - else { - /* align stem on pixel boundary */ - shift = ROUND(center) - center; - } - - if (verticalondevice) { - shiftx = shift; - shifty = 0.0; - } else { - shifty = shift; - shiftx = 0.0; - } - - p = Loc(IDENTITY, shiftx, shifty); - QueryLoc(p, CharSpace, &Xpixels, &Ypixels); - wsoffsetX = Xpixels; wsoffsetY = Ypixels; - currx += wsoffsetX; curry += wsoffsetY; - - return (p); -} - -/*----------------------------------------------------------------------- - Decrypt - From Adobe Type 1 book page 63, with some modifications ------------------------------------------------------------------------*/ -#define KEY 4330 /* Initial key (seed) for CharStrings decryption */ -#define C1 52845 /* Multiplier for pseudo-random number generator */ -#define C2 22719 /* Constant for pseudo-random number generator */ - -static unsigned short r; /* Pseudo-random sequence of keys */ - -static unsigned char -Decrypt(unsigned char cipher) -{ - unsigned char plain; - - plain = cipher ^ (r >> 8); - r = (cipher + r) * C1 + C2; - return plain; -} - -/* Get the next byte from the codestring being interpreted */ -static int -DoRead(int *CodeP) -{ - if (strindex >= CharStringP->len) return(FALSE); /* end of string */ - *CodeP = Decrypt((unsigned char) CharStringP->data.stringP[strindex++]); - return(TRUE); -} - -/* Strip blues->lenIV bytes from CharString and update encryption key */ -/* (the lenIV entry in the Private dictionary specifies the number of */ -/* random bytes at the beginning of each CharString; default is 4) */ -static void -StartDecrypt(void) -{ - int Code; - - r = KEY; /* Initial key (seed) for CharStrings decryption */ - for (strindex = 0; strindex < blues->lenIV;) - if (!DoRead(&Code)) /* Read a byte and update decryption key */ - Error; -} - -static void -Decode(int Code) -{ - int Code1, Code2, Code3, Code4; - - if (Code <= 31) /* Code is [0,31] */ - DoCommand(Code); - else if (Code <= 246) /* Code is [32,246] */ - Push((double)(Code - 139)); - else if (Code <= 250) { /* Code is [247,250] */ - if (!DoRead(&Code2)) goto ended; - Push((double)(((Code - 247) << 8) + Code2 + 108)); - } - else if (Code <= 254) { /* Code is [251,254] */ - if (!DoRead(&Code2)) goto ended; - Push((double)( -((Code - 251) << 8) - Code2 - 108)); - } - else { /* Code is 255 */ - if (!DoRead(&Code1)) goto ended; - if (!DoRead(&Code2)) goto ended; - if (!DoRead(&Code3)) goto ended; - if (!DoRead(&Code4)) goto ended; - Push((double)((((((Code1<<8) + Code2)<<8) + Code3)<<8) + Code4)); - } - return; - -ended: Error; -} - -/* Interpret a command code */ -static void -DoCommand(int Code) -{ - switch(Code) { - case HSTEM: /* |- y dy HSTEM |- */ - /* Vertical range of a horizontal stem zone */ - if (Top < 1) Error; - HStem(Stack[0], Stack[1]); - ClearStack(); - break; - case VSTEM: /* |- x dx VSTEM |- */ - /* Horizontal range of a vertical stem zone */ - if (Top < 1) Error; - VStem(Stack[0], Stack[1]); - ClearStack(); - break; - case VMOVETO: /* |- dy VMOVETO |- */ - /* Vertical MOVETO, equivalent to 0 dy RMOVETO */ - if (Top < 0) Error; - RMoveTo(0.0, Stack[0]); - ClearStack(); - break; - case RLINETO: /* |- dx dy RLINETO |- */ - /* Like RLINETO in PostScript */ - if (Top < 1) Error; - RLineTo(Stack[0], Stack[1]); - ClearStack(); - break; - case HLINETO: /* |- dx HLINETO |- */ - /* Horizontal LINETO, equivalent to dx 0 RLINETO */ - if (Top < 0) Error; - RLineTo(Stack[0], 0.0); - ClearStack(); - break; - case VLINETO: /* |- dy VLINETO |- */ - /* Vertical LINETO, equivalent to 0 dy RLINETO */ - if (Top < 0) Error; - RLineTo(0.0, Stack[0]); - ClearStack(); - break; - case RRCURVETO: - /* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ - /* Relative RCURVETO, equivalent to dx1 dy1 */ - /* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ - /* (dy1+dy2+dy3) RCURVETO in PostScript */ - if (Top < 5) Error; - RRCurveTo(Stack[0], Stack[1], Stack[2], Stack[3], - Stack[4], Stack[5]); - ClearStack(); - break; - case CLOSEPATH: /* - CLOSEPATH |- */ - /* Closes a subpath without repositioning the */ - /* current point */ - DoClosePath(); - ClearStack(); - break; - case CALLSUBR: /* subr# CALLSUBR - */ - /* Calls a CharString subroutine with index */ - /* subr# from the Subrs array */ - if (Top < 0) Error; - CallSubr((int)Stack[Top--]); - break; - case RETURN: /* - RETURN - */ - /* Returns from a Subrs array CharString */ - /* subroutine called with CALLSUBR */ - Return(); - break; - case ESCAPE: /* ESCAPE to two-byte command code */ - if (!DoRead(&Code)) Error; - Escape(Code); - break; - case HSBW: /* |- sbx wx HSBW |- */ - /* Set the left sidebearing point to (sbx,0), */ - /* set the character width vector to (wx,0). */ - /* Equivalent to sbx 0 wx 0 SBW. Space */ - /* character should have sbx = 0 */ - if (Top < 1) Error; - Sbw(Stack[0], 0.0, Stack[1], 0.0); - ClearStack(); - break; - case ENDCHAR: /* - ENDCHAR |- */ - /* Finishes a CharString outline */ - EndChar(); - ClearStack(); - break; - case RMOVETO: /* |- dx dy RMOVETO |- */ - /* Behaves like RMOVETO in PostScript */ - if (Top < 1) Error; - RMoveTo(Stack[0], Stack[1]); - ClearStack(); - break; - case HMOVETO: /* |- dx HMOVETO |- */ - /* Horizontal MOVETO. Equivalent to dx 0 RMOVETO */ - if (Top < 0) Error; - RMoveTo(Stack[0], 0.0); - ClearStack(); - break; - case VHCURVETO: /* |- dy1 dx2 dy2 dx3 VHCURVETO |- */ - /* Vertical-Horizontal CURVETO, equivalent to */ - /* 0 dy1 dx2 dy2 dx3 0 RRCURVETO */ - if (Top < 3) Error; - RRCurveTo(0.0, Stack[0], Stack[1], Stack[2], - Stack[3], 0.0); - ClearStack(); - break; - case HVCURVETO: /* |- dx1 dx2 dy2 dy3 HVCURVETO |- */ - /* Horizontal-Vertical CURVETO, equivalent to */ - /* dx1 0 dx2 dy2 0 dy3 RRCURVETO */ - if (Top < 3) Error; - RRCurveTo(Stack[0], 0.0, Stack[1], Stack[2], 0.0, Stack[3]); - ClearStack(); - break; - default: /* Unassigned command code */ - ClearStack(); - Error; - } -} - -static void -Escape(int Code) -{ - int i, Num; - struct segment *p; - - switch(Code) { - case DOTSECTION: /* - DOTSECTION |- */ - /* Brackets an outline section for the dots in */ - /* letters such as "i", "j", and "!". */ - DotSection(); - ClearStack(); - break; - case VSTEM3: /* |- x0 dx0 x1 dx1 x2 dx2 VSTEM3 |- */ - /* Declares the horizontal ranges of three */ - /* vertical stem zones between x0 and x0+dx0, */ - /* x1 and x1+dx1, and x2 and x2+dx2. */ - if (Top < 5) Error; - if (!wsset && ProcessHints) { - /* Shift the whole character so that the middle stem is centered. */ - p = CenterStem(Stack[2] + sidebearingX, Stack[3]); - path = Join(path, p); - wsset = 1; - } - - VStem(Stack[0], Stack[1]); - VStem(Stack[2], Stack[3]); - VStem(Stack[4], Stack[5]); - ClearStack(); - break; - case HSTEM3: /* |- y0 dy0 y1 dy1 y2 dy2 HSTEM3 |- */ - /* Declares the vertical ranges of three hori- */ - /* zontal stem zones between y0 and y0+dy0, */ - /* y1 and y1+dy1, and y2 and y2+dy2. */ - if (Top < 5) Error; - HStem(Stack[0], Stack[1]); - HStem(Stack[2], Stack[3]); - HStem(Stack[4], Stack[5]); - ClearStack(); - break; - case SEAC: /* |- asb adx ady bchar achar SEAC |- */ - /* Standard Encoding Accented Character. */ - if (Top < 4) Error; - Seac(Stack[0], Stack[1], Stack[2], - (unsigned char) Stack[3], - (unsigned char) Stack[4]); - ClearStack(); - break; - case SBW: /* |- sbx sby wx wy SBW |- */ - /* Set the left sidebearing point to (sbx,sby), */ - /* set the character width vector to (wx,wy). */ - if (Top < 3) Error; - Sbw(Stack[0], Stack[1], Stack[2], Stack[3]); - ClearStack(); - break; - case DIV: /* num1 num2 DIV quotient */ - /* Behaves like DIV in the PostScript language */ - if (Top < 1) Error; - Stack[Top-1] = Div(Stack[Top-1], Stack[Top]); - Top--; - break; - case CALLOTHERSUBR: - /* arg1 ... argn n othersubr# CALLOTHERSUBR - */ - /* Make calls on the PostScript interpreter */ - if (Top < 1) Error; - Num = Stack[Top-1]; - if (Top < Num+1) Error; - for (i = 0; i < Num; i++) PSFakePush(Stack[Top - i - 2]); - Top -= Num + 2; -#if XFONT_CID - if ((int)Stack[Top + Num + 2] > 3) - ClearPSFakeStack(); - else - CallOtherSubr((int)Stack[Top + Num + 2]); -#else - CallOtherSubr((int)Stack[Top + Num + 2]); -#endif - break; - case POP: /* - POP number */ - /* Removes a number from the top of the */ - /* PostScript interpreter stack and pushes it */ - /* onto the Type 1 BuildChar operand stack */ - Push(PSFakePop()); - break; - case SETCURRENTPOINT: /* |- x y SETCURRENTPOINT |- */ - /* Sets the current point to (x,y) in absolute */ - /* character space coordinates without per- */ - /* forming a CharString MOVETO command */ - if (Top < 1) Error; - SetCurrentPoint(Stack[0], Stack[1]); - ClearStack(); - break; - default: /* Unassigned escape code command */ - ClearStack(); - Error; - } -} - -/* |- y dy HSTEM |- */ -/* Declares the vertical range of a horizontal stem zone */ -/* between coordinates y and y + dy */ -/* y is relative to the left sidebearing point */ -static void -HStem(double y, double dy) -{ - if (ProcessHints) { - if (numstems >= MAXSTEMS) Error; - if (dy < 0.0) {y += dy; dy = -dy;} - stems[numstems].vertical = FALSE; - stems[numstems].x = 0.0; - stems[numstems].y = sidebearingY + y + wsoffsetY; - stems[numstems].dx = 0.0; - stems[numstems].dy = dy; - ComputeStem(numstems); - numstems++; - } -} - -/* |- x dx VSTEM |- */ -/* Declares the horizontal range of a vertical stem zone */ -/* between coordinates x and x + dx */ -/* x is relative to the left sidebearing point */ - -static void -VStem(double x, double dx) -{ - if (ProcessHints) { - if (numstems >= MAXSTEMS) Error; - if (dx < 0.0) {x += dx; dx = -dx;} - stems[numstems].vertical = TRUE; - stems[numstems].x = sidebearingX + x + wsoffsetX; - stems[numstems].y = 0.0; - stems[numstems].dx = dx; - stems[numstems].dy = 0.0; - ComputeStem(numstems); - numstems++; - } -} - -/* |- dx dy RLINETO |- */ -/* Behaves like RLINETO in PostScript */ -static void -RLineTo(double dx, double dy) -{ - struct segment *B; - - B = Loc(CharSpace, dx, dy); - - if (ProcessHints) { - currx += dx; - curry += dy; - /* B = Join(B, FindStems(currx, curry)); */ - B = Join(B, FindStems(currx, curry, dx, dy)); - } - - path = Join(path, Line(B)); -} - -/* |- dx1 dy1 dx2 dy2 dx3 dy3 RRCURVETO |- */ -/* Relative RCURVETO, equivalent to dx1 dy1 */ -/* (dx1+dx2) (dy1+dy2) (dx1+dx2+dx3) */ -/* (dy1+dy2+dy3) RCURVETO in PostScript */ -static void -RRCurveTo(double dx1, double dy1, double dx2, double dy2, - double dx3, double dy3) -{ - struct segment *B, *C, *D; - - B = Loc(CharSpace, dx1, dy1); - C = Loc(CharSpace, dx2, dy2); - D = Loc(CharSpace, dx3, dy3); - - if (ProcessHints) { - /* For a Bezier curve, we apply the full hint value to - the Bezier C point (and thereby D point). */ - currx += dx1 + dx2 + dx3; - curry += dy1 + dy2 + dy3; - /* C = Join(C, FindStems(currx, curry)); */ - C = Join(C, FindStems(currx, curry, dx3, dy3)); - } - - /* Since XIMAGER is not completely relative, */ - /* we need to add up the delta values */ - - C = Join(C, (struct segment *)Dup(B)); - D = Join(D, (struct segment *)Dup(C)); - - path = Join(path, (struct segment *)Bezier(B, C, D)); -} - -/* - CLOSEPATH |- */ -/* Closes a subpath WITHOUT repositioning the */ -/* current point */ -static void -DoClosePath(void) -{ - struct segment *CurrentPoint; - - CurrentPoint = Phantom(path); - path = ClosePath(path); - path = Join(Snap(path), CurrentPoint); -} - -/* subr# CALLSUBR - */ -/* Calls a CharString subroutine with index */ -/* subr# from the Subrs array */ -static void -CallSubr(int subrno) -{ - if ((subrno < 0) || (subrno >= SubrsP->len)) - Error; - PushCall(CharStringP, strindex, r); - CharStringP = &SubrsP->data.arrayP[subrno]; - StartDecrypt(); -} - -/* - RETURN - */ -/* Returns from a Subrs array CharString */ -/* subroutine called with CALLSUBR */ -static void -Return(void) -{ - PopCall(&CharStringP, &strindex, &r); -} - -/* - ENDCHAR |- */ -/* Finishes a CharString outline */ -/* Executes SETCHACHEDEVICE using a bounding box */ -/* it computes directly from the character outline */ -/* and using the width information acquired from a previous */ -/* HSBW or SBW. It then calls a special version of FILL */ -/* or STROKE depending on the value of PaintType in the */ -/* font dictionary */ -static void -EndChar(void) -{ - /* There is no need to compute and set bounding box for - the cache, since XIMAGER does that on the fly. */ - - /* Perform a Closepath just in case the command was left out */ - path = ClosePath(path); - - /* Set character width */ - path = Join(Snap(path), Loc(CharSpace, escapementX, escapementY)); - -} - -/* |- dx dy RMOVETO |- */ -/* Behaves like RMOVETO in PostScript */ -static void -RMoveTo(double dx, double dy) -{ - struct segment *B; - - B = Loc(CharSpace, dx, dy); - - if (ProcessHints) { - currx += dx; - curry += dy; - /* B = Join(B, FindStems(currx, curry)); */ - B = Join(B, FindStems(currx, curry, 0.0, 0.0)); - } - - path = Join(path, B); -} - -/* - DOTSECTION |- */ -/* Brackets an outline section for the dots in */ -/* letters such as "i", "j", and "!". */ -static void -DotSection(void) -{ - InDotSection = !InDotSection; -} - -/* |- asb adx ady bchar achar SEAC |- */ -/* Standard Encoding Accented Character. */ -static void -Seac(double asb, double adx, double ady, - unsigned char bchar, unsigned char achar) -{ - int Code; - struct segment *mypath; - - /* Move adx - asb, ady over and up from base char's sbpoint. */ - /* (We use adx - asb to counteract the accents sb shift.) */ - /* The variables accentoffsetX/Y modify sidebearingX/Y in Sbw(). */ - /* Note that these incorporate the base character's sidebearing shift by */ - /* using the current sidebearingX, Y values. */ - accentoffsetX = sidebearingX + adx - asb; - accentoffsetY = sidebearingY + ady; - - /* Set path = NULL to avoid complaints from Sbw(). */ - path = NULL; - - /* Go find the CharString for the accent's code via an upcall */ - CharStringP = GetType1CharString((psfont *)Environment, achar); - StartDecrypt(); - - ClearStack(); - ClearPSFakeStack(); - ClearCallStack(); - - for (;;) { - if (!DoRead(&Code)) break; - Decode(Code); - if (errflag) return; - } - /* Copy snapped path to mypath and set path to NULL as above. */ - mypath = Snap(path); - path = NULL; - - /* We must reset these to null now. */ - accentoffsetX = accentoffsetY = 0; - - /* go find the CharString for the base char's code via an upcall */ - CharStringP = GetType1CharString((psfont *)Environment, bchar); - StartDecrypt(); - - ClearStack(); - ClearPSFakeStack(); - ClearCallStack(); - - FinitStems(); - InitStems(); - - for (;;) { - if (!DoRead(&Code)) break; - Decode(Code); - if (errflag) return; - } - path = Join(mypath, path); -} - - -/* |- sbx sby wx wy SBW |- */ -/* Set the left sidebearing point to (sbx,sby), */ -/* set the character width vector to (wx,wy). */ -static void -Sbw(double sbx, double sby, double wx, double wy) -{ - escapementX = wx; /* Character width vector */ - escapementY = wy; - - /* Sidebearing values are sbx, sby args, plus accent offset from Seac(). */ - sidebearingX = sbx + accentoffsetX; - sidebearingY = sby + accentoffsetY; - - path = Join(path, Loc(CharSpace, sidebearingX, sidebearingY)); - if (ProcessHints) {currx = sidebearingX; curry = sidebearingY;} -} - - /* num1 num2 DIV quotient */ -/* Behaves like DIV in the PostScript language */ -static double -Div(double num1, double num2) -{ - return(num1 / num2); -} - -/* - The following four subroutines (FlxProc, FlxProc1, FlxProc2, and - HintReplace) are C versions of the OtherSubrs Programs, which were - were published in the Adobe Type 1 Font Format book. - - The Flex outline fragment is described by - c1: (x0, y0) = c3: (x0, yshrink(y0)) or (xshrink(x0), y0) - " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) - " (x2, y2) - reference point - c2: (x0, y0) = c4: (x0, yshrink(y0)) or (xshrink(x0), y0) - " (x1, y1) = " (x1, yshrink(y1)) or (xshrink(x1), y1) - " (x2, y2) = " (x2, y2), rightmost endpoint - c3: (x0, y0) - control point, 1st Bezier curve - " (x1, y1) - control point, -"- - " (x2, y2) - end point, -"- - c4: (x0, y0) - control point, 2nd Bezier curve - " (x1, y1) - control point, -"- - " (x2, y2) - end point, -"- - ep: (epY, epX) - final endpoint (should be same as c4: (x2, y2)) - idmin - minimum Flex height (1/100 pixel) at which to render curves -*/ - -#define dtransform(dxusr,dyusr,dxdev,dydev) { \ - register struct segment *point = Loc(CharSpace, dxusr, dyusr); \ - QueryLoc(point, IDENTITY, dxdev, dydev); \ - Destroy(point); \ -} - -#define itransform(xdev,ydev,xusr,yusr) { \ - register struct segment *point = Loc(IDENTITY, xdev, ydev); \ - QueryLoc(point, CharSpace, xusr, yusr); \ - Destroy(point); \ -} - -#define transform(xusr,yusr,xdev,ydev) dtransform(xusr,yusr,xdev,ydev) - -#define PaintType (0) - -#define lineto(x,y) { \ - struct segment *CurrentPoint; \ - double CurrentX, CurrentY; \ - CurrentPoint = Phantom(path); \ - QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \ - Destroy(CurrentPoint); \ - RLineTo(x - CurrentX, y - CurrentY); \ -} - -#define curveto(x0,y0,x1,y1,x2,y2) { \ - struct segment *CurrentPoint; \ - double CurrentX, CurrentY; \ - CurrentPoint = Phantom(path); \ - QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); \ - Destroy(CurrentPoint); \ - RRCurveTo(x0 - CurrentX, y0 - CurrentY, x1 - x0, y1 - y0, x2 - x1, y2 - y1); \ -} - -#define xshrink(x) ((x - c4x2) * shrink +c4x2) -#define yshrink(y) ((y - c4y2) * shrink +c4y2) - -#define PickCoords(flag) \ - if (flag) { /* Pick "shrunk" coordinates */ \ - x0 = c1x0; y0 = c1y0; \ - x1 = c1x1; y1 = c1y1; \ - x2 = c1x2; y2 = c1y2; \ - x3 = c2x0; y3 = c2y0; \ - x4 = c2x1; y4 = c2y1; \ - x5 = c2x2; y5 = c2y2; \ - } else { /* Pick original coordinates */ \ - x0 = c3x0; y0 = c3y0; \ - x1 = c3x1; y1 = c3y1; \ - x2 = c3x2; y2 = c3y2; \ - x3 = c4x0; y3 = c4y0; \ - x4 = c4x1; y4 = c4y1; \ - x5 = c4x2; y5 = c4y2; \ - } - -/* FlxProc() = OtherSubrs[0]; Main part of Flex */ -/* Calling sequence: 'idmin epX epY 3 0 callothersubr' */ -/* Computes Flex values, and renders the Flex path, */ -/* and returns (leaves) ending coordinates on stack */ -static void -FlxProc(double c1x2, double c1y2, double c3x0, double c3y0, - double c3x1, double c3y1, double c3x2, double c3y2, - double c4x0, double c4y0, double c4x1, double c4y1, - double c4x2, double c4y2, double epY, double epX, int idmin) -{ - double dmin; - double c1x0, c1y0, c1x1, c1y1; - double c2x0, c2y0, c2x1, c2y1, c2x2, c2y2; - char yflag; - double x0, y0, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5; - double cxx, cyx, cxy, cyy; /* Transformation matrix */ - int flipXY; - double x, y; - double erosion = 1; /* Device parameter */ - /* Erosion may have different value specified in 'internaldict' */ - double shrink; - double dX, dY; - char erode; - double eShift; - double cx, cy; - double ex, ey; - - c1x0 = c1y0 = c1x1 = c1y1 = c2x0 = c2y0 = c2x1 = c2y1 = c2x2 = c2y2 = 0.0; - - Destroy(path); - path = FlxOldPath; /* Restore previous path (stored in FlxProc1) */ - - if (ProcessHints) { - dmin = ABS(idmin) / 100.0; /* Minimum Flex height in pixels */ - - c2x2 = c4x2; c2y2 = c4y2; /* Point c2 = c4 */ - - yflag = FABS(c1y2 - c3y2) > FABS(c1x2 - c3x2); /* Flex horizontal? */ - - QuerySpace(CharSpace, &cxx, &cyx, &cxy, &cyy); /* Transformation matrix */ - - if (FABS(cxx) < 0.00001 || FABS(cyy) < 0.00001) - flipXY = -1; /* Char on side */ - else if (FABS(cyx) < 0.00001 || FABS(cxy) < 0.00001) - flipXY = 1; /* Char upright */ - else - flipXY = 0; /* Char at angle */ - - if (yflag) { /* Flex horizontal */ - if (flipXY == 0 || c3y2 == c4y2) { /* Char at angle or Flex height = 0 */ - PickCoords(FALSE); /* Pick original control points */ - } else { - shrink = FABS((c1y2 - c4y2) / (c3y2 - c4y2)); /* Slope */ - - c1x0 = c3x0; c1y0 = yshrink(c3y0); - c1x1 = c3x1; c1y1 = yshrink(c3y1); - c2x0 = c4x0; c2y0 = yshrink(c4y0); - c2x1 = c4x1; c2y1 = yshrink(c4y1); - - dtransform(0.0, ROUND(c3y2-c1y2), &x, &y); /* Flex height in pixels */ - dY = FABS((flipXY == 1) ? y : x); - PickCoords(dY < dmin); /* If Flex small, pick 'shrunk' control points */ - - if (FABS(y2 - c1y2) > 0.001) { /* Flex 'non-zero'? */ - transform(c1x2, c1y2, &x, &y); - - if (flipXY == 1) { - cx = x; cy = y; - } else { - cx = y; cy = x; - } - - dtransform(0.0, ROUND(y2-c1y2), &x, &y); - dY = (flipXY == 1) ? y : x; - if (ROUND(dY) != 0) - dY = ROUND(dY); - else - dY = (dY < 0) ? -1 : 1; - - erode = PaintType != 2 && erosion >= 0.5; - if (erode) - cy -= 0.5; - ey = cy + dY; - ey = CEIL(ey) - ey; - ey = ey + FLOOR(cy + dY); - if (erode) - ey += 0.5; - - if (flipXY == 1) { - itransform(cx, ey, &x, &y); - } else { - itransform(ey, cx, &x, &y); - } - - eShift = y - y2; - y1 += eShift; - y2 += eShift; - y3 += eShift; - } - } - } else { /* Flex vertical */ - if (flipXY == 0 || c3x2 == c4x2) { /* Char at angle or Flex height = 0 */ - PickCoords(FALSE); /* Pick original control points */ - } else { - shrink = FABS((c1x2 - c4x2) / (c3x2 - c4x2)); /* Slope */ - - c1x0 = xshrink(c3x0); c1y0 = c3y0; - c1x1 = xshrink(c3x1); c1y1 = c3y1; - c2x0 = xshrink(c4x0); c2y0 = c4y0; - c2x1 = xshrink(c4x1); c2y1 = c4y1; - - dtransform(ROUND(c3x2 - c1x2), 0.0, &x, &y); /* Flex height in pixels */ - dX = FABS((flipXY == -1) ? y : x); - PickCoords(dX < dmin); /* If Flex small, pick 'shrunk' control points */ - - if (FABS(x2 - c1x2) > 0.001) { - transform(c1x2, c1y2, &x, &y); - if (flipXY == -1) { - cx = y; cy = x; - } else { - cx = x; cy = y; - } - - dtransform(ROUND(x2-c1x2), 0.0, &x, &y); - dX = (flipXY == -1) ? y : x; - if (ROUND(dX) != 0) - dX = ROUND(dX); - else - dX = (dX < 0) ? -1 : 1; - - erode = PaintType != 2 && erosion >= 0.5; - if (erode) - cx -= 0.5; - ex = cx + dX; - ex = CEIL(ex) - ex; - ex = ex + FLOOR(cx + dX); - if (erode) - ex += 0.5; - - if (flipXY == -1) { - itransform(cy, ex, &x, &y); - } else { - itransform(ex, cy, &x, &y); - } - - eShift = x - x2; - x1 += eShift; - x2 += eShift; - x3 += eShift; - } - } - } - - if (x2 == x5 || y2 == y5) { - lineto(x5, y5); - } else { - curveto(x0, y0, x1, y1, x2, y2); - curveto(x3, y3, x4, y4, x5, y5); - } - } else { /* ProcessHints is off */ - PickCoords(FALSE); /* Pick original control points */ - curveto(x0, y0, x1, y1, x2, y2); - curveto(x3, y3, x4, y4, x5, y5); - } - - PSFakePush(epY); - PSFakePush(epX); -} - -/* FlxProc1() = OtherSubrs[1]; Part of Flex */ -/* Calling sequence: '0 1 callothersubr' */ -/* Saves and clears path, then restores currentpoint */ -static void -FlxProc1(void) -{ - struct segment *CurrentPoint; - - CurrentPoint = Phantom(path); - - FlxOldPath = path; - path = CurrentPoint; -} - -/* FlxProc2() = OtherSubrs[2]; Part of Flex */ -/* Calling sequence: '0 2 callothersubr' */ -/* Returns currentpoint on stack */ -static void -FlxProc2(void) -{ - struct segment *CurrentPoint; - double CurrentX, CurrentY; - - CurrentPoint = Phantom(path); - QueryLoc(CurrentPoint, CharSpace, &CurrentX, &CurrentY); - Destroy(CurrentPoint); - - /* Push CurrentPoint on fake PostScript stack */ - PSFakePush(CurrentX); - PSFakePush(CurrentY); -} - -/* HintReplace() = OtherSubrs[3]; Hint Replacement */ -/* Calling sequence: 'subr# 1 3 callothersubr pop callsubr' */ -/* Reinitializes stem hint structure */ -static void -HintReplace(void) -{ - /* Effectively retire the current stems, but keep them around for */ - /* revhint use in case we are in a stem when we replace hints. */ - currstartstem = numstems; - - /* 'subr#' is left on PostScript stack (for 'pop callsubr') */ -} - -/* arg1 ... argn n othersubr# CALLOTHERSUBR - */ -/* Make calls on the PostScript interpreter (or call equivalent C code) */ -/* NOTE: The n arguments have been pushed on the fake PostScript stack */ -static void -CallOtherSubr(int othersubrno) -{ - switch(othersubrno) { - case 0: /* OtherSubrs[0]; Main part of Flex */ - if (PSFakeTop < 16) Error; - ClearPSFakeStack(); - FlxProc( - PSFakeStack[0], PSFakeStack[1], PSFakeStack[2], PSFakeStack[3], - PSFakeStack[4], PSFakeStack[5], PSFakeStack[6], PSFakeStack[7], - PSFakeStack[8], PSFakeStack[9], PSFakeStack[10], PSFakeStack[11], - PSFakeStack[12], PSFakeStack[13], PSFakeStack[14], PSFakeStack[15], - (int) PSFakeStack[16] - ); - break; - case 1: /* OtherSubrs[1]; Part of Flex */ - FlxProc1(); - break; - case 2: /* OtherSubrs[2]; Part of Flex */ - FlxProc2(); - break; - case 3: /* OtherSubrs[3]; Hint Replacement */ - HintReplace(); - break; - default: { /* call OtherSubrs[4] or higher if PostScript is present */ - } - } -} - -/* |- x y SETCURRENTPOINT |- */ -/* Sets the current point to (x,y) in absolute */ -/* character space coordinates without per- */ -/* forming a CharString MOVETO command */ -static void -SetCurrentPoint(double x, double y) -{ - currx = x; - curry = y; -} - -/* The Type1Char routine for use by PostScript. */ -/************************************************/ -struct xobject * -Type1Char(char *env, struct XYspace *S, psobj *charstrP, psobj *subrsP, - psobj *osubrsP, - struct blues_struct *bluesP, /* FontID's ptr to the blues struct */ - int *modeP) -{ - int Code; - - path = NULL; - errflag = FALSE; - - /* Make parameters available to all Type1 routines */ - Environment = env; - CharSpace = S; /* used when creating path elements */ - CharStringP = charstrP; - SubrsP = subrsP; - - blues = bluesP; - - /* compute the alignment zones */ - ComputeAlignmentZones(); - - StartDecrypt(); - - ClearStack(); - ClearPSFakeStack(); - ClearCallStack(); - - InitStems(); - - currx = curry = 0; - escapementX = escapementY = 0; - sidebearingX = sidebearingY = 0; - accentoffsetX = accentoffsetY = 0; - wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */ - wsset = 0; /* wsoffsetX,Y haven't been set yet. */ - - for (;;) { - if (!DoRead(&Code)) break; - Decode(Code); - if (errflag) break; - } - - FinitStems(); - - - /* Clean up if an error has occurred */ - if (errflag) { - if (path != NULL) { - Destroy(path); /* Reclaim storage */ - path = NULL; /* Indicate that character could not be built */ - } - } - - return((struct xobject *) path); -} - -#if XFONT_CID -struct xobject * -CIDChar(char *env, struct XYspace *S, - psobj *charstrP, psobj *subrsP, psobj *osubrsP, - struct blues_struct *bluesP, /* FontID's ptr to the blues struct */ - int *modeP) -{ - int Code; - - path = NULL; - errflag = FALSE; - - /* Make parameters available to all CID routines */ - Environment = env; - CharSpace = S; /* used when creating path elements */ - CharStringP = charstrP; - SubrsP = subrsP; - - blues = bluesP; - - /* compute the alignment zones */ - ComputeAlignmentZones(); - - StartDecrypt(); - - ClearStack(); - ClearPSFakeStack(); - ClearCallStack(); - - InitStems(); - - currx = curry = 0; - escapementX = escapementY = 0; - sidebearingX = sidebearingY = 0; - accentoffsetX = accentoffsetY = 0; - wsoffsetX = wsoffsetY = 0; /* No shift to preserve whitspace. */ - wsset = 0; /* wsoffsetX,Y haven't been set yet. */ - - for (;;) { - if (!DoRead(&Code)) break; - Decode(Code); - if (errflag) break; - } - - FinitStems(); - - /* Clean up if an error has occurred */ - if (errflag) { - if (path != NULL) { - Destroy(path); /* Reclaim storage */ - path = NULL; /* Indicate that character could not be built */ - } - } - - return((struct xobject *) path); -} -#endif diff --git a/nx-X11/lib/font/Type1/util.c b/nx-X11/lib/font/Type1/util.c deleted file mode 100644 index 7c5a81dee..000000000 --- a/nx-X11/lib/font/Type1/util.c +++ /dev/null @@ -1,222 +0,0 @@ -/* $Xorg: util.c,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/util.c,v 1.5 1999/08/21 13:47:53 dawes Exp $ */ -/* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include -#else -#include "Xdefs.h" -#include "Xmd.h" -#include "xf86_ansic.h" -#endif -#include "util.h" -#include /* for xalloc/xfree */ - -static char *vm_base = NULL; /* Start of virtual memory area */ - char *vm_next = NULL; /* Pointer to first free byte */ - long vm_free = 0; /* Count of free bytes */ - long vm_size = 0; /* Total size of memory */ - -/* - * Initialize memory. - */ -boolean -vm_init(int cnt) -{ -#if XFONT_CID - if (vm_base == NULL || (vm_base != NULL && vm_size != cnt)) { - if (vm_base != NULL) xfree(vm_base); - vm_next = vm_base = (char *)xalloc (cnt); - } else - vm_next = vm_base; -#else - vm_next = vm_base = (char *)xalloc (cnt); -#endif - - if (vm_base != NULL) { - vm_free = cnt; - vm_size = cnt; - return(TRUE); - } - else - return(FALSE); - -} - -char * -vm_alloc(int bytes) -{ - char *answer; - - /* Round to next word multiple */ - bytes = (bytes + 7) & ~7; - - /* Allocate the space, if it is available */ - if (bytes > 0 && bytes <= vm_free) { - answer = vm_next; - vm_free -= bytes; - vm_next += bytes; - } - else - answer = NULL; - - return(answer); -} - -/* - * Format an Integer object - */ -void -objFormatInteger(psobj *objP, int value) -{ - if (objP != NULL) { - objP->type = OBJ_INTEGER; - objP->len = 0; - objP->data.integer = value; - } -} - -/* - * Format a Real object - */ -void -objFormatReal(psobj *objP, float value) -{ - if (objP != NULL) { - objP->type = OBJ_REAL; - objP->len = 0; - objP->data.real = value; - } -} - -/* - * Format a Boolean object - */ -void -objFormatBoolean(psobj *objP, boolean value) -{ - if (objP != NULL) { - objP->type = OBJ_BOOLEAN; - objP->len = 0; - objP->data.boolean = value; - } -} - -/* - * Format an Encoding object - */ -void -objFormatEncoding(psobj *objP, int length, psobj *valueP) -{ - if (objP != NULL) { - objP->type = OBJ_ENCODING; - objP->len = length; - objP->data.arrayP = valueP; - } -} - -/* - * Format an Array object - */ -void -objFormatArray(psobj *objP, int length, psobj *valueP) -{ - if (objP != NULL) { - objP->type = OBJ_ARRAY; - objP->len = length; - objP->data.arrayP = valueP; - } -} - - -/* - * Format a String object - */ -void -objFormatString(psobj *objP, int length, char *valueP) -{ - if (objP != NULL) { - objP->type = OBJ_STRING; - objP->len = length; - objP->data.valueP = valueP; - } -} - -/* - * Format a Name object - */ -void -objFormatName(psobj *objP, int length, char *valueP) -{ - if (objP != NULL) { - objP->type = OBJ_NAME; - objP->len = length; - objP->data.nameP = valueP; - } -} - -/* - * Format a File object - */ -void -objFormatFile(psobj *objP, FILE *valueP) -{ - if (objP != NULL) { - objP->type = OBJ_FILE; - objP->len = 0; - objP->data.fileP = valueP; - } -} - diff --git a/nx-X11/lib/font/Type1/util.h b/nx-X11/lib/font/Type1/util.h deleted file mode 100644 index a1a8b3e6b..000000000 --- a/nx-X11/lib/font/Type1/util.h +++ /dev/null @@ -1,217 +0,0 @@ -/* $Xorg: util.h,v 1.3 2000/08/17 19:46:34 cpqbld Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License to use, copy, modify, and distribute this software - * and its documentation for any purpose and without fee is - * hereby granted, 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 IBM not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM 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. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/util.h,v 1.4 1999/08/22 08:58:55 dawes Exp $ */ - -#ifndef UTIL_H -#define UTIL_H - -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef boolean -typedef int boolean; -#endif - -#ifndef TRUE -#define TRUE (1) -#endif - -#ifndef FALSE -#define FALSE (0) -#endif - -/***================================================================***/ -/* Portable definitions for 2's complement machines. - * NOTE: These really should be based on PostScript types, - * for example, sizeof(ps_integer), or sizeof(ps_unsigned) - */ -#define MAX_ULONG (~(unsigned long)(0)) -/* This code is portable, assuming K&R C and 2's complement arithmetic */ -#define MAX_INTEGER \ - ((long)((((unsigned long) 1)<<(sizeof(unsigned long)*8-1))-1)) -#define MIN_INTEGER ((-MAX_INTEGER)-1) - -#define MAX_ARRAY_CNT (65535) -#define MAX_DICT_CNT (65535) -#define MAX_STRING_LEN (65535) -#define MAX_NAME_LEN (128) - -/* this is the size of memory allocated for reading fonts */ - -#if XFONT_CID -#define VM_SIZE (100*1024) -#else -#define VM_SIZE (50*1024) -#endif -/***================================================================***/ - -#ifndef MIN -#define MIN(a,b) (((a)<(b)) ? a : b ) -#endif - -/***================================================================***/ -/* Routines for managing virtual memory */ -/***================================================================***/ - -extern boolean vm_init ( int cnt ); -extern long vm_free; -extern long vm_size; -extern char *vm_next; -extern char *vm_alloc ( int bytes ); - -/***================================================================***/ -/* Macros for managing virtual memory */ -/***================================================================***/ -#define vm_next_byte() (vm_next) -#define vm_free_bytes() (vm_free) -#define vm_avail(B) (B <= vm_free) - - - -/***================================================================***/ -/* Types of PostScript objects */ -/***================================================================***/ -#define OBJ_INTEGER (0) -#define OBJ_REAL (1) -#define OBJ_BOOLEAN (2) -#define OBJ_ARRAY (3) -#define OBJ_STRING (4) -#define OBJ_NAME (5) -#define OBJ_FILE (6) -#define OBJ_ENCODING (7) - -/***================================================================***/ -/* Value of PostScript objects */ -/***================================================================***/ -typedef union ps_value { - char *valueP; /* value pointer for unspecified type */ - int value; /* value for unspecified type */ - int integer; /* when type is OBJ_INTEGER */ - float real; /* when type is OBJ_REAL */ - int boolean; /* when type is OBJ_BOOLEAN */ - struct ps_obj *arrayP; /* when type is OBJ_ARRAY */ - unsigned char *stringP; /* when type is OBJ_STRING */ - char *nameP; /* when type is OBJ_NAME */ - FILE *fileP; /* when type is OBJ_FILE */ -} psvalue; - -/***================================================================***/ -/* Definition of a PostScript object */ -/***================================================================***/ -typedef struct ps_obj { - char type; - char unused; - unsigned short len; - union ps_value data; -} psobj; - -/***================================================================***/ -/* Definition of a PostScript Dictionary Entry */ -/***================================================================***/ -typedef struct ps_dict { - psobj key; - psobj value; -} psdict; - -/***================================================================***/ -/* Macros for testing type of PostScript objects */ -/***================================================================***/ -#define objIsInteger(o) ((o).type == OBJ_INTEGER) -#define objIsReal(o) ((o).type == OBJ_REAL) -#define objIsBoolean(o) ((o).type == OBJ_BOOLEAN) -#define objIsArray(o) ((o).type == OBJ_ARRAY) -#define objIsString(o) ((o).type == OBJ_STRING) -#define objIsName(o) ((o).type == OBJ_NAME) -#define objIsFile(o) ((o).type == OBJ_FILE) - -/***================================================================***/ -/* Macros for setting type of PostScript objects */ -/***================================================================***/ -#define objSetInteger(o) ((o).type = OBJ_INTEGER) -#define objSetReal(o) ((o).type = OBJ_REAL) -#define objSetBoolean(o) ((o).type = OBJ_BOOLEAN) -#define objSetArray(o) ((o).type = OBJ_ARRAY) -#define objSetString(o) ((o).type = OBJ_STRING) -#define objSetName(o) ((o).type = OBJ_NAME) -#define objSetFile(o) ((o).type = OBJ_FILE) - -/***================================================================***/ -/* Macros for testing type of PostScript objects (pointer access) */ -/***================================================================***/ -#define objPIsInteger(o) ((o)->type == OBJ_INTEGER) -#define objPIsReal(o) ((o)->type == OBJ_REAL) -#define objPIsBoolean(o) ((o)->type == OBJ_BOOLEAN) -#define objPIsArray(o) ((o)->type == OBJ_ARRAY) -#define objPIsString(o) ((o)->type == OBJ_STRING) -#define objPIsName(o) ((o)->type == OBJ_NAME) -#define objPIsFile(o) ((o)->type == OBJ_FILE) - -/***================================================================***/ -/* Macros for setting type of PostScript objects (pointer access) */ -/***================================================================***/ -#define objPSetInteger(o) ((o)->type = OBJ_INTEGER) -#define objPSetReal(o) ((o)->type = OBJ_REAL) -#define objPSetBoolean(o) ((o)->type = OBJ_BOOLEAN) -#define objPSetArray(o) ((o)->type = OBJ_ARRAY) -#define objPSetString(o) ((o)->type = OBJ_STRING) -#define objPSetName(o) ((o)->type = OBJ_NAME) -#define objPSetFile(o) ((o)->type = OBJ_FILE) - -/***================================================================***/ -/* Prototypes of object formatting functions */ -/***================================================================***/ -extern void objFormatInteger ( psobj *objP, int value ); -extern void objFormatReal ( psobj *objP, float value ); -extern void objFormatBoolean ( psobj *objP, boolean value ); -extern void objFormatEncoding ( psobj *objP, int length, psobj *valueP ); -extern void objFormatArray ( psobj *objP, int length, psobj *valueP ); -extern void objFormatString ( psobj *objP, int length, char *valueP ); -extern void objFormatName ( psobj *objP, int length, char *valueP ); -extern void objFormatFile ( psobj *objP, FILE *valueP ); - -#endif -- cgit v1.2.3