summaryrefslogtreecommitdiff
path: root/Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c')
-rw-r--r--Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c1266
1 files changed, 0 insertions, 1266 deletions
diff --git a/Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c b/Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c
deleted file mode 100644
index 4c5b8e5d628..00000000000
--- a/Build/source/libs/t1lib/t1lib-5.1.2/lib/type1/fontfcn.c
+++ /dev/null
@@ -1,1266 +0,0 @@
-/* $XConsortium: fontfcn.c,v 1.8 92/03/27 18:15:45 eswu 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 */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "t1imager.h"
-#include "util.h"
-#include "fontfcn.h"
-#include "fontmisc.h"
-#include "paths_rmz.h"
-
-#include "../t1lib/parseAFM.h"
-#include "../t1lib/t1types.h"
-#include "../t1lib/t1extern.h"
-#include "../t1lib/t1misc.h"
-#include "../t1lib/t1base.h"
-#include "../t1lib/t1finfo.h"
-
-/* Note: The argument decodeonly is used to make Type1Char() decode only
- such that later certain characterictics of the pass can be queried
- (here, information about the parts of a seac).
-*/
-extern xobject Type1Char(psfont *env, struct XYspace *S,
- psobj *charstrP, psobj *subrsP,
- psobj *osubrsP,
- struct blues_struct *bluesP,
- int *modeP, char *name,
- float strokewidth,
- int decodeonly);
-extern xobject Type1Line(psfont *env, struct XYspace *S,
- float line_position,
- float line_thickness,
- float line_length,
- float strokewidth);
-extern int T1int_Type1QuerySEAC( unsigned char* base,
- unsigned char* accent);
-void objFormatName(psobj *objP, int length, char *valueP);
-
-extern void T1io_reset( void);
-
-#define BEZIERTYPE 0x10+0x02
-#define LINETYPE 0x10+0x00
-#define MOVETYPE 0x10+0x05
-
-#if 1
-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 */
- int (*newedgefcn)(); /* function to use when building a new edge */
- struct strokeinfo *strokeinfo; /* scratchpad info during stroking only */
-} ;
-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 */
-};
-#endif
-
-/***================================================================***/
-/* GLOBALS */
-/***================================================================***/
-static char CurCharName[257]="";
-static char BaseCharName[257]="";
-char CurFontName[MAXPATHLEN+1];
-char *CurFontEnv;
-char *vm_base = NULL;
-
-static char notdef[]=".notdef";
-
-
-/* the following is inserted by RMz for VM checking and reallocating: */
-char *vm_used = NULL;
-extern int vm_init_count;
-extern int vm_init_amount;
-
-static psfont *FontP = NULL;
-psfont TheCurrentFont;
-
-
-/***================================================================***/
-/* SearchDict - look for name */
-/* - compare for match on len and string */
-/* return 0 - not found. */
-/* return n - nth element in dictionary. */
-/***================================================================***/
-int SearchDictName(dictP,keyP)
- 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);
-}
-/***================================================================***/
-/* assignment of &TheCurrentFont removed by RMz:
- */
-boolean initFont()
-{
- if (!(vm_init())) return(FALSE);
- vm_base = vm_next_byte();
- strcpy(CurFontName, ""); /* iniitialize to none */
- FontP->vm_start = vm_next_byte();
- FontP->FontFileName.len = 0;
- FontP->FontFileName.data.valueP = CurFontName;
- return(TRUE);
-}
-/***================================================================***/
-int resetFont(env)
-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 */
- strncpy(CurFontName,env, MAXPATHLEN);
- CurFontName[MAXPATHLEN] = '\0';
- FontP->FontFileName.len = strlen(CurFontName);
- FontP->FontFileName.data.nameP = CurFontName;
- T1io_reset();
-
- return(0);
-
-}
-/***================================================================***/
-/* Read font used to attempt to load the font and, upon failure,
- try a second time with twice as much memory. Unfortunately, if
- it's a really complex font, simply using 2*vm_size may be insufficient.
- I've modified it so that the program will try progressively larger
- amounts of memory until it really runs out or the font loads
- successfully. (ndw)
-*/
-int readFont(env)
-char *env;
-{
- int rcode;
- /* int memscale = 2; */ /* initially, try twice just like we used to ... */
-
- /* restore the virtual memory and eliminate old font */
-
- resetFont(env);
- /* This will load the font into the FontP */
-
- rcode = scan_font(FontP);
- return(rcode);
-}
-
-
-static int isCompositeChar( int FontID,
- char *charname)
-{
- int i;
- FontInfo *pAFMData;
-
- if (pFontBase->pFontArray[FontID].pAFMData==NULL) {
- /* No AFM data present */
- return( -1);
- }
-
- pAFMData=pFontBase->pFontArray[FontID].pAFMData;
- for ( i=0; i<pAFMData->numOfComps; i++) {
- if (strcmp( pAFMData->ccd[i].ccName, charname)==0)
- return( i);
- }
-
- return( -1);
-
-}
-
-
-
-/* dump a description of path elements to stdout */
-static T1_PATHPOINT getDisplacement( struct segment *path)
-{
-
- register struct segment *ipath;
- register struct beziersegment *ibpath;
- T1_PATHPOINT point={0,0};
-
- /* Step through the path list */
- ipath=(struct segment *)path;
-
- do {
- if (ipath->type==LINETYPE) {
- point.x+=ipath->dest.x;
- point.y+=ipath->dest.y;
- }
- else if (ipath->type==MOVETYPE) {
- point.x+=ipath->dest.x;
- point.y+=ipath->dest.y;
- }
- else if (ipath->type==BEZIERTYPE) {
- ibpath=(struct beziersegment *)ipath;
- point.x+=ibpath->dest.x;
- point.y+=ibpath->dest.y;
- }
- ipath=ipath->link;
- } while (ipath!=NULL);
- return( point);
-
-}
-
-
-
-/***================================================================***/
-/* RMz: instead of code, which is a character pointer to the name
- of the character, we use "ev" which is a pointer to a desired
- encoding vector (or NULL if font-internal encoding should be
- used) and "index" as an index into the desired encoding vector!
- The user thus has the opportunity of supplying whatever encoding
- he wants. Font_Ptr is the pointer to the local psfont-structure.
- */
-
-xobject fontfcnB(int FontID, int modflag,
- struct XYspace *S, char **ev,
- unsigned char index, int *mode,
- psfont *Font_Ptr,
- int do_raster,
- float strokewidth)
-{
-
- psobj *charnameP; /* points to psobj that is name of character*/
- FontInfo *pAFMData=NULL;
- int i=-1;
- int j=0;
- int numPieces=1;
- int N;
- T1_PATHPOINT currdisp;
- int basechar;
-
- psdict *CharStringsDictP; /* dictionary with char strings */
- psobj CodeName; /* used to store the translation of the name*/
- psobj *SubrsArrayP;
- psobj *theStringP;
- int localmode=0;
-
- struct segment *charpath=NULL; /* the path for this character */
- struct segment *tmppath1=NULL;
- struct segment *tmppath2=NULL;
- struct segment *tmppath3=NULL;
- struct segment *tmppath4=NULL;
-
-
- /* set the global font pointer to the address of already allocated
- structure and setup pointers*/
- FontP=Font_Ptr;
- CharStringsDictP = FontP->CharStringsP;
- SubrsArrayP = &(FontP->Subrs);
- charnameP = &CodeName;
-
- if (ev==NULL){ /* font-internal encoding should be used */
- charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[index].len;
- charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[index].data.arrayP;
- }
- else{ /* some user-supplied encoding is to be used */
- charnameP->len = strlen(ev[index]);
- charnameP->data.stringP = (unsigned char *) ev[index];
- }
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
-
-
- /* search the chars string for this charname as key */
- basechar = SearchDictName(CharStringsDictP,charnameP);
- if (basechar<=0) {
- /* Check first, whether a char in question is a composite char */
- if ((i=isCompositeChar( FontID, CurCharName))>-1) {
- /* i is now the index of the composite char definitions
- (starting at 0). At this point it is clear that AFM-info
- must be present -> fetch first component of composite char. */
- pAFMData=pFontBase->pFontArray[FontID].pAFMData;
- charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName;
- numPieces=pAFMData->ccd[i].numOfPieces;
-
- if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* this is bad, AFM-file and font file do not match. This
- will most probably lead to errors or inconsistencies later.
- However, we substitute .notdef and inform the user via
- logfile and T1_errno. */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[0].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- T1_errno=T1ERR_COMPOSITE_CHAR;
- }
- }
- }
-
- if (basechar<=0) { /* This means the requested char is unknown or the
- base char of a composite is not found ->
- we substitute .notdef */
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- basechar = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* Font must be completely damaged if it doesn't define a .notdef */
- if (basechar<=0) {
- *mode=FF_PARSE_ERROR;
- return(NULL);
- }
- } /* if (basechar<=0) */
- /* basechar is now the index of the base character in the CharStrings
- dictionary */
-
- /* we provide the Type1Char() procedure with the name of the character
- to rasterize for debugging purposes */
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- /* get CharString and character path */
- theStringP = &(CharStringsDictP[basechar].value);
- tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName,strokewidth,0);
- /* if Type1Char reported an error, then return */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR)
- return(NULL);
-
- /* Defer rastering to later, we first have to handle the composite
- symbols */
- for (j=1; j<numPieces; j++) {
- /* get composite symbol name */
- charnameP->len=strlen( pAFMData->ccd[i].pieces[j].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName;
- /* get CharString definition */
- if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* handling of errors, see comments above ... */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[j].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- N = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* damaged Font */
- if (N<=0) {
- *mode=FF_PARSE_ERROR;
- if (charpath!=NULL) {
- KillPath( charpath);
- }
- return(NULL);
- }
- }
- theStringP = &(CharStringsDictP[N].value);
- tmppath1=(struct segment *)ILoc(S,
- pAFMData->ccd[i].pieces[j].deltax,
- pAFMData->ccd[i].pieces[j].deltay);
-
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName,strokewidth,0);
- /* return if Type1Char reports an error */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR)
- return(NULL);
- /* get escapement of current symbol */
- currdisp=getDisplacement( charpath);
- /* concat displacement and symbol path */
- charpath=(struct segment *)Join(tmppath1,charpath);
- /* for composite symbols we have to step back the char escapement.
- this is, in order to be able to use accents that cause a
- non zero displacement of the current point! We further have to
- step back the displacement from composite char data. */
- tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y);
- tmppath3=(struct segment *)ILoc(S,
- -pAFMData->ccd[i].pieces[j].deltax,
- -pAFMData->ccd[i].pieces[j].deltay);
- tmppath3=(struct segment *)Join(tmppath1,tmppath3);
- /* create path, or, respectively, append to existing path */
- if (tmppath4==NULL) {
- tmppath4=(struct segment *)Join(charpath,tmppath3);
- }
- else {
- charpath=(struct segment *)Join(charpath,tmppath3);
- tmppath4=(struct segment *)Join(tmppath4,charpath);
- }
- }
-
- /* concat composite symbols and base char */
- if (tmppath4==NULL) { /* no previous composite symbols */
- charpath=tmppath2; /* a simple char */
- }
- else {
- charpath=(struct segment *)Join(tmppath4,tmppath2);
- }
-
-
- if (do_raster) {
- /* fill with winding rule unless path was requested */
- if (*mode != FF_PATH) {
- charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY);
- }
- }
-
- if (*mode==0)
- *mode=localmode;
-
- return((xobject) charpath);
-}
-
-
-
-
-/***================================================================***/
-/* 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 */
-/* */
-/* This function has been modified by RMz. It now takes a pointer which
- already contains the address of a valid type1 font structure as the
- third argument. The value of this pointer is first handed to FontP
- so that most other routines may be used without changes */
-
-#define MAXTRIAL 4
-
-/***================================================================***/
-Bool fontfcnA(env,mode,Font_Ptr)
-char *env;
-int *mode;
-psfont *Font_Ptr;
-
-{
- int i, result;
-
- /* set the global font pointer to the address of already allocated
- structure */
- FontP=Font_Ptr;
-
- InitImager();
-
- /* Read the font program. */
- for (i=1; i<MAXTRIAL; i++){
- vm_init_count=0;
- /* We allocate larger chunks (4*65536 Bytes) in order to reduce load
- time for large fonts by initially requesting somewhat more
- memory. */
- vm_init_amount=MAX_STRING_LEN * 4 * i;
- if (!(initFont())) {
- /* we are really out of memory, not simulated! */
- *mode = SCAN_OUT_OF_MEMORY;
- return(FALSE);
- }
- /* Try to read font into memory */
- if ((result=readFont(env))==0){
- /* In order to get the amount of memory that was really used */
- vm_used=vm_next_byte();
- return(TRUE);
- }
- else{
- /* VM did not suffice, free it and try again with larger
- value: */
- free(vm_base);
- }
- }
- /* Font could not be loaded: */
- *mode = result;
- return(FALSE);
-
-}
-
-
-/***================================================================***/
-/* 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(env,infoName,infoValue,rcodeP)
-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())) {
- *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;
- 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;
-}
-
-
-/***================================================================***/
-/* RMz: instead of code, which is a character pointer to the name
- of the character, we use "ev" which is a pointer to a desired
- encoding vector (or NULL if font-internal encoding should be
- used) and "index" as an index into the desired encoding vector!
- The user thus has the opportunity of supplying whatever encoding
- he wants. Font_Ptr is the pointer to the local psfont-structure.
- */
-xobject fontfcnB_string( int FontID, int modflag,
- struct XYspace *S, char **ev,
- unsigned char *string, int no_chars,
- int *mode, psfont *Font_Ptr,
- int *kern_pairs, long spacewidth,
- int do_raster,
- float strokewidth)
-{
-
- psobj *charnameP; /* points to psobj that is name of character*/
- FontInfo *pAFMData=NULL;
- int i=-1;
- int j=0;
- int k=0;
- long acc_width=0;
- int numPieces=1;
- int N;
- T1_PATHPOINT currdisp;
- int basechar;
-
- psdict *CharStringsDictP; /* dictionary with char strings */
- psobj CodeName; /* used to store the translation of the name*/
- psobj *SubrsArrayP;
- psobj *theStringP;
- int localmode=0;
-
- struct segment *charpath=NULL; /* the path for this character */
- struct segment *tmppath1=NULL;
- struct segment *tmppath2=NULL;
- struct segment *tmppath3=NULL;
- struct segment *tmppath4=NULL;
- struct segment *tmppath5=NULL;
-
-
- /* set the global font pointer to the address of already allocated
- structure and setup pointers*/
- FontP=Font_Ptr;
- CharStringsDictP = FontP->CharStringsP;
- SubrsArrayP = &(FontP->Subrs);
- charnameP = &CodeName;
-
-
- /* In the following for-loop, all characters are processed, one after
- the other. Between them, the amount of kerning is inserted.
- The number of path variables used is somewhat numerous. We use the
- follwing conventions:
-
- charpath: the overall path of the string.
- tmppath5: the overall path of one component (possibly a composite symbol)
- tmppath2: the path of a simple char or base char of a composite
- tmppath4: the path of all "accents" of a composite symbol
- */
- for (k=0; k<no_chars;k++) {
- if (ev==NULL){ /* font-internal encoding should be used */
- charnameP = &CodeName;
- charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].len;
- charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[string[k]].data.arrayP;
- }
- else { /* some user-supplied encoding is to be used */
- charnameP = &CodeName;
- charnameP->len = strlen(ev[string[k]]);
- charnameP->data.stringP = (unsigned char*) ev[string[k]];
- }
-
- /* Spacing is to be under users control: => if space is the charname, don't
- raster it. Rather, generate a horizontal movement of spacewidth: */
- if (strcmp((char *)charnameP->data.stringP, "space")==0){
- tmppath5=(struct segment *)ILoc(S, spacewidth,0);
- acc_width += spacewidth;
- }
- else {
- /* here a character or composite character is to be constructed */
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
-
- /* search the CharString for this charname as key */
- basechar = SearchDictName(CharStringsDictP,charnameP);
- if (basechar<=0) {
- /* Check first, whether a char in question is a composite char */
- if ((i=isCompositeChar( FontID, CurCharName))>-1) {
- /* i is now the index of the composite char definitions
- (starting at 0). At this point it is clear that AFM-info
- must be present -> fetch first component of composite char. */
- pAFMData=pFontBase->pFontArray[FontID].pAFMData;
- charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName;
- numPieces=pAFMData->ccd[i].numOfPieces;
-
- if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* this is bad, AFM-file and font file do not match. This
- will most probably lead to errors or inconsistencies later.
- However, we substitute .notdef and inform the user via
- logfile and T1_errno. */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[0].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- T1_errno=T1ERR_COMPOSITE_CHAR;
- }
- }
- }
-
- if (basechar<=0) { /* This means the requested char is unknown or the
- base char of a composite is not found ->
- we substitute .notdef */
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- basechar = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* Font must be completely damaged if it doesn't define a .notdef */
- if (basechar<=0) {
- *mode=FF_PARSE_ERROR;
- return(NULL);
- }
- } /* if (basechar<=0) */
- /* basechar is now the index of the base character in the CharStrings
- dictionary */
-
- /* we provide the Type1Char() procedure with the name of the character
- to rasterize for debugging purposes */
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- /* get CharString and character path */
- theStringP = &(CharStringsDictP[basechar].value);
- tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName,strokewidth,0);
- strcpy( BaseCharName, CurCharName);
- /* if Type1Char reports an error, clean up and return */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR) {
- if (charpath!=NULL) {
- KillPath( charpath);
- }
- if (tmppath1!=NULL) {
- KillPath( tmppath1);
- }
- if (tmppath2!=NULL) {
- KillPath( tmppath2);
- }
- if (tmppath3!=NULL) {
- KillPath( tmppath3);
- }
- if (tmppath4!=NULL) {
- KillPath( tmppath4);
- }
- if (tmppath5!=NULL) {
- KillPath( tmppath5);
- }
- return(NULL);
- }
-
- /* Defer rastering to later, we first have to handle the composite
- symbols */
- for (j=1; j<numPieces; j++) {
- /* get composite symbol name */
- charnameP->len=strlen( pAFMData->ccd[i].pieces[j].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName;
- /* get CharString definition */
- if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* handling of errors, see comments above ... */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[j].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- N = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* an undefined .notdef is fatal -> clean up and return */
- if (N<=0) {
- *mode=FF_PARSE_ERROR;
- if (charpath!=NULL) {
- KillPath( charpath);
- }
- if (tmppath1!=NULL) {
- KillPath( tmppath1);
- }
- if (tmppath2!=NULL) {
- KillPath( tmppath2);
- }
- if (tmppath3!=NULL) {
- KillPath( tmppath3);
- }
- if (tmppath4!=NULL) {
- KillPath( tmppath4);
- }
- if (tmppath5!=NULL) {
- KillPath( tmppath5);
- }
- return(NULL);
- }
- }
- theStringP = &(CharStringsDictP[N].value);
- tmppath1=(struct segment *)ILoc(S,
- pAFMData->ccd[i].pieces[j].deltax,
- pAFMData->ccd[i].pieces[j].deltay);
-
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- tmppath5=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName,strokewidth,0);
- /* return if Type1Char reports an error */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR)
- return(NULL);
- /* get escapement of current symbol */
- currdisp=getDisplacement( tmppath5);
- /* concat displacement and symbol path */
- tmppath5=(struct segment *)Join(tmppath1,tmppath5);
- /* for composite symbols we have to step back the char escapement.
- this is, in order to be able to use accents that cause a
- non zero displacement of the current point! We further have to
- step back the displacement from composite char data. */
- tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y);
- tmppath3=(struct segment *)ILoc(S,
- -pAFMData->ccd[i].pieces[j].deltax,
- -pAFMData->ccd[i].pieces[j].deltay);
- tmppath3=(struct segment *)Join(tmppath1,tmppath3);
- /* create path, or, respectively, append to existing path */
- if (tmppath4==NULL) {
- tmppath4=(struct segment *)Join(tmppath5,tmppath3);
- }
- else {
- tmppath5=(struct segment *)Join(tmppath5,tmppath3);
- tmppath4=(struct segment *)Join(tmppath4,tmppath5);
- }
- }
-
- /* concat composite symbols and base char. We use tmppath5 to store
- the path of the resulting (possibly composite) character. */
- if (tmppath4==NULL) { /* no previous composite symbols */
- tmppath5=tmppath2; /* a simple char */
- }
- else {
- tmppath5=(struct segment *)Join(tmppath4,tmppath2);
- }
-
-
- /* Accumulate displacement, but be careful: In case of composite
- characters, we have to take the escapement of the base char only
- into account, because accents do not cause spacing. The path is
- constructed in a way that this automatically matches.
- */
- if (numPieces>1) { /* composite character */
- acc_width +=pFontBase->pFontArray[FontID].pAFMData->ccd[-(pFontBase->pFontArray[FontID].pEncMap[string[k]]+1)].wx;
- }
- else { /* ordinary character */
- acc_width +=pFontBase->pFontArray[FontID].pAFMData->cmi[pFontBase->pFontArray[FontID].pEncMap[string[k]]-1].wx;
- }
-
- } /* else (if (char==space) */
-
- /* character path is now stored in tmppath5. It may be a composite character.
- Insert kerning amount, if it is not the last character of the string. */
- if (k<no_chars-1){
- tmppath2=(struct segment *)ILoc(S,kern_pairs[k],0);
- tmppath5=(struct segment *)Join(tmppath5,tmppath2);
- acc_width += kern_pairs[k];
- }
- if (charpath!=NULL){
- charpath=(struct segment *)Join(charpath,tmppath5);
- }
- else{
- charpath=(struct segment *)tmppath5;
- }
- /* reset the temporary paths so that constructing composite
- characters wiil continue to work properly in the next interation. */
- tmppath1=NULL;
- tmppath2=NULL;
- tmppath3=NULL;
- tmppath4=NULL;
- tmppath5=NULL;
- /* reset composition parameters */
- i=-1;
- numPieces=1;
-
- } /* for (k<no_chars) */
-
-
- /* Take care for underlining and such */
- if (modflag & T1_UNDERLINE){
- tmppath2=(struct segment *)Type1Line(FontP,S,
- pFontBase->pFontArray[FontID].UndrLnPos,
- pFontBase->pFontArray[FontID].UndrLnThick,
- (float) acc_width,strokewidth);
- charpath=(struct segment *)Join(charpath,tmppath2);
- }
- if (modflag & T1_OVERLINE){
- tmppath2=(struct segment *)Type1Line(FontP,S,
- pFontBase->pFontArray[FontID].OvrLnPos,
- pFontBase->pFontArray[FontID].OvrLnThick,
- (float) acc_width,strokewidth);
- charpath=(struct segment *)Join(charpath,tmppath2);
- }
- if (modflag & T1_OVERSTRIKE){
- tmppath2=(struct segment *)Type1Line(FontP,S,
- pFontBase->pFontArray[FontID].OvrStrkPos,
- pFontBase->pFontArray[FontID].OvrStrkThick,
- (float) acc_width,strokewidth);
- charpath=(struct segment *)Join(charpath,tmppath2);
- }
-
- /*
- printf("charpath->type: %x\n",charpath->type);
- printf("path1->type: %x\n",path1->type);
- printf("path2->type: %x\n",path2->type);
- */
-
- /* if Type1Char reported an error, then return */
-
- if ( *mode == FF_PARSE_ERROR) return(NULL);
- if ( *mode == FF_PATH_ERROR) return(NULL);
- if (do_raster) {
- /* fill with winding rule unless path was requested */
- if (*mode != FF_PATH) {
- charpath = (struct segment *) Interior((path) charpath,WINDINGRULE+CONTINUITY);
- }
- }
-
- if (*mode==0)
- *mode=localmode;
-
- return((path)charpath);
-}
-
-
-/* This special variant is for generating character bitmaps from
- charactername */
-xobject fontfcnB_ByName( int FontID, int modflag,
- struct XYspace *S,
- unsigned char *charname,
- int *mode, psfont *Font_Ptr,
- int do_raster)
-{
-
- psobj *charnameP; /* points to psobj that is name of character*/
- FontInfo *pAFMData=NULL;
- int i=-1;
- int j=0;
- int numPieces=1;
- int N;
- T1_PATHPOINT currdisp;
- int basechar;
-
- psdict *CharStringsDictP; /* dictionary with char strings */
- psobj CodeName; /* used to store the translation of the name*/
- psobj *SubrsArrayP;
- psobj *theStringP;
- int localmode=0;
-
- struct segment *charpath=NULL; /* the path for this character */
- struct segment *tmppath1=NULL;
- struct segment *tmppath2=NULL;
- struct segment *tmppath3=NULL;
- struct segment *tmppath4=NULL;
-
-
- /* set the global font pointer to the address of already allocated
- structure and setup pointers*/
- FontP=Font_Ptr;
- CharStringsDictP = FontP->CharStringsP;
- SubrsArrayP = &(FontP->Subrs);
- charnameP = &CodeName;
-
- charnameP->len = strlen((char*)charname);
- charnameP->data.stringP = charname;
-
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
-
-
- /* search the chars string for this charname as key */
- basechar = SearchDictName(CharStringsDictP,charnameP);
- if (basechar<=0) {
- /* Check first, whether a char in question is a composite char */
- if ((i=isCompositeChar( FontID, CurCharName))>-1) {
- /* i is now the index of the composite char definitions
- (starting at 0). At this point it is clear that AFM-info
- must be present -> fetch first component of composite char. */
- pAFMData=pFontBase->pFontArray[FontID].pAFMData;
- charnameP->len=strlen( pAFMData->ccd[i].pieces[0].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[0].pccName;
- numPieces=pAFMData->ccd[i].numOfPieces;
-
- if ((basechar=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* this is bad, AFM-file and font file do not match. This
- will most probably lead to errors or inconsistencies later.
- However, we substitute .notdef and inform the user via
- logfile and T1_errno. */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[0].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- T1_errno=T1ERR_COMPOSITE_CHAR;
- }
- }
- }
-
- if (basechar<=0) { /* This means the requested char is unknown or the
- base char of a composite is not found ->
- we substitute .notdef */
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- basechar = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* Font must be completely damaged if it doesn't define a .notdef */
- if (basechar<=0) {
- *mode=FF_PARSE_ERROR;
- return(NULL);
- }
- } /* if (basechar<=0) */
- /* basechar is now the index of the base character in the CharStrings
- dictionary */
-
- /* we provide the Type1Char() procedure with the name of the character
- to rasterize for debugging purposes */
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- /* get CharString and character path */
- theStringP = &(CharStringsDictP[basechar].value);
- tmppath2 = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName, 0.0f, 0);
- /* if Type1Char reported an error, then return */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR)
- return(NULL);
-
- /* Defer rastering to later, we first have to handle the composite
- symbols */
- for (j=1; j<numPieces; j++) {
- /* get composite symbol name */
- charnameP->len=strlen( pAFMData->ccd[i].pieces[j].pccName);
- charnameP->data.stringP=(unsigned char*)pAFMData->ccd[i].pieces[j].pccName;
- /* get CharString definition */
- if ((N=SearchDictName(CharStringsDictP,charnameP))<=0) {
- /* handling of errors, see comments above ... */
- sprintf( err_warn_msg_buf,
- "Charstring \"%s\" needed to construct composite char \"%s\" not defined (FontID=%d)",
- pAFMData->ccd[i].pieces[j].pccName,
- pAFMData->ccd[i].ccName, FontID);
- T1_PrintLog( "fontfcnB():", err_warn_msg_buf, T1LOG_WARNING);
- charnameP = &CodeName;
- charnameP->len = 7;
- charnameP->data.stringP = (unsigned char *) notdef;
- N = SearchDictName(CharStringsDictP,charnameP);
- localmode=FF_NOTDEF_SUBST;
- /* damaged Font */
- if (N<=0) {
- *mode=FF_PARSE_ERROR;
- if (charpath!=NULL) {
- KillPath( charpath);
- }
- return(NULL);
- }
- }
- theStringP = &(CharStringsDictP[N].value);
- tmppath1=(struct segment *)ILoc(S,
- pAFMData->ccd[i].pieces[j].deltax,
- pAFMData->ccd[i].pieces[j].deltay);
-
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- charpath=(struct segment *)Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,mode,CurCharName,0.0f,0);
- /* return if Type1Char reports an error */
- if ( *mode == FF_PARSE_ERROR || *mode==FF_PATH_ERROR)
- return(NULL);
- /* get escapement of current symbol */
- currdisp=getDisplacement( charpath);
- /* concat displacement and symbol path */
- charpath=(struct segment *)Join(tmppath1,charpath);
- /* for composite symbols we have to step back the char escapement.
- this is, in order to be able to use accents that cause a
- non zero displacement of the current point! We further have to
- step back the displacement from composite char data. */
- tmppath1=(struct segment *)t1_PathSegment( MOVETYPE, -currdisp.x, -currdisp.y);
- tmppath3=(struct segment *)ILoc(S,
- -pAFMData->ccd[i].pieces[j].deltax,
- -pAFMData->ccd[i].pieces[j].deltay);
- tmppath3=(struct segment *)Join(tmppath1,tmppath3);
- /* create path, or, respectively, append to existing path */
- if (tmppath4==NULL) {
- tmppath4=(struct segment *)Join(charpath,tmppath3);
- }
- else {
- charpath=(struct segment *)Join(charpath,tmppath3);
- tmppath4=(struct segment *)Join(tmppath4,charpath);
- }
- }
-
- /* concat composite symbols and base char */
- if (tmppath4==NULL) { /* no previous composite symbols */
- charpath=tmppath2; /* a simple char */
- }
- else {
- charpath=(struct segment *)Join(tmppath4,tmppath2);
- }
-
-
- if (do_raster) {
- /* fill with winding rule unless path was requested */
- if (*mode != FF_PATH) {
- charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY);
- }
- }
-
- if (*mode==0)
- *mode=localmode;
-
- return((xobject) charpath);
-
-}
-
-
-xobject fontfcnRect( float width,
- float height,
- struct XYspace* S,
- int *mode,
- int do_raster,
- float strokewidth)
-{
- struct segment *charpath = NULL; /* the path for this character (rectangle) */
-
- charpath = (struct segment *) Type1Line( NULL, S,
- 0.5f * height, /* position */
- height, /* thickness */
- -width, /* width */
- strokewidth /* strokewidth */
- );
-
- if (do_raster) {
- /* fill with winding rule unless path was requested */
- if (*mode != FF_PATH) {
- charpath = (struct segment *)Interior(charpath,WINDINGRULE+CONTINUITY);
- }
- }
-
- return((xobject) charpath);
-
-}
-
-
-
-/* T1int_QuerySEAC(): Query for Type of character definition of index "index".
-
- Returns: 0 if charstring for currenc[index] not defined
- 1 if charstring defines a self-containing character
- 2 if charstring references other definition by means of
- the SEAC directive.
-*/
-int T1int_QuerySEAC( int FontID,
- unsigned char index,
- unsigned char* basepiece,
- unsigned char* accpiece
- )
-{
-
- psobj *charnameP; /* points to psobj that is name of character*/
- int thischar;
- int mode = 0;
-
- psdict *CharStringsDictP; /* dictionary with char strings */
- psobj CodeName; /* used to store the translation of the name*/
- psobj *SubrsArrayP;
- psobj *theStringP;
- char **ev;
- struct XYspace *S;
- struct segment *path=NULL; /* the path for this character */
-
-
- /* set the global font pointer to the address of already allocated
- structure and setup pointers*/
- FontP=pFontBase->pFontArray[FontID].pType1Data;
- CharStringsDictP = FontP->CharStringsP;
- SubrsArrayP = &(FontP->Subrs);
- charnameP = &CodeName;
-
- /* get encoding */
- ev=pFontBase->pFontArray[FontID].pFontEnc;
-
- if (ev==NULL){ /* font-internal encoding should be used */
- charnameP->len = FontP->fontInfoP[ENCODING].value.data.arrayP[index].len;
- charnameP->data.stringP = (unsigned char *) FontP->fontInfoP[ENCODING].value.data.arrayP[index].data.arrayP;
- }
- else{ /* some user-supplied encoding is to be used */
- charnameP->len = strlen(ev[index]);
- charnameP->data.stringP = (unsigned char *) ev[index];
- }
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
-
-
- /* search the chars string for this charname as key */
- thischar = SearchDictName(CharStringsDictP,charnameP);
- /* thischar is now the index of the base character in the CharStrings
- dictionary */
-
- if ( thischar <= 0 ) {
- /* CharString not defined, return */
- return 0;
- }
-
- /* Setup NULL-space, not needed when paths aren't created */
- S = NULL;
-
-
- /* we provide the Type1Char() procedure with the name of the character
- to rasterize for debugging purposes */
- strncpy( (char *)CurCharName, (char *)charnameP->data.stringP, charnameP->len);
- CurCharName[charnameP->len]='\0';
- /* get CharString and character path */
- theStringP = &(CharStringsDictP[thischar].value);
-
- path = (struct segment *) Type1Char(FontP,S,theStringP,SubrsArrayP,NULL,
- FontP->BluesP,&mode,CurCharName,0, 1);
-
- /* if Type1Char reported an error, then return */
- if ( mode == FF_PARSE_ERROR || mode==FF_PATH_ERROR) {
- return -1;
- }
-
- if ( T1int_Type1QuerySEAC( basepiece, accpiece) > 0 ) {
- return 2;
- }
-
- return 1;
-
-}