⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fontfcn.c

📁 unix vnc 协议源码. VNC是一款远程控制工具软件.
💻 C
字号:
/* $XConsortium: fontfcn.c,v 1.10 94/02/06 16:07:23 gildea 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 "t1imager.h"#include "util.h"#include "fontfcn.h"#include "fontmisc.h" extern xobject Type1Char();/***================================================================***//*   GLOBALS                                                          *//***================================================================***/char CurFontName[120];char *CurFontEnv;char *vm_base = NULL;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);}/***================================================================***/boolean initFont(cnt)int cnt;{  if (!(vm_init(cnt))) return(FALSE);  vm_base = vm_next_byte();  if (!(Init_BuiltInEncoding())) return(FALSE);  strcpy(CurFontName, "");    /* iniitialize to none */  FontP = &TheCurrentFont;  FontP->vm_start = vm_next_byte();  FontP->FontFileName.len = 0;  FontP->FontFileName.data.valueP = CurFontName;  return(TRUE);}/***================================================================***/static void 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 */  strcpy(CurFontName,env);  FontP->FontFileName.len = strlen(CurFontName);  FontP->FontFileName.data.valueP = CurFontName; }/***================================================================***/int readFont(env)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 */    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);    /* only double the memory once, then report error */  }  return(rcode);}/***================================================================***/xobject fontfcnB(S,code,lenP,mode)XYspace S;unsigned char *code;int  *lenP;int  *mode;{  path updateWidth();   psobj *charnameP; /* points to psobj that is name of character*/  int   N;  unsigned char *s;          /* used to search the name for '|' */  psdict *CharStringsDictP; /* dictionary with char strings     */  psobj   CodeName;   /* used to store the translation of the name*/  psobj  *SubrsArrayP;  psobj  *theStringP;   path  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 = Type1Char(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 =  Interior(charpath,WINDINGRULE+CONTINUITY);  }  return(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                                               *//***================================================================***/Bool fontfcnA(env,mode)char *env;int  *mode;{  int rc;   /* Has the FontP initialized?  If not, then   */  /* Initialize  */  if (FontP == NULL) {    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); }/***================================================================***//*   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(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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -