]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/lib/font/Type1/fontfcn.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / lib / font / Type1 / fontfcn.c
diff --git a/Xserver/lib/font/Type1/fontfcn.c b/Xserver/lib/font/Type1/fontfcn.c
new file mode 100644 (file)
index 0000000..39fb510
--- /dev/null
@@ -0,0 +1,309 @@
+/* $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;
+}