]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blobdiff - zephyr/zwgc/X_fonts.c
new upstream version
[1ts-debian.git] / zephyr / zwgc / X_fonts.c
index ca7617d48f0f832d7ef55d2cf55e25a7da929ccf..ed2bcda65809b6b26f42024f590d287c7bb58b8e 100644 (file)
@@ -4,7 +4,7 @@
  *
  *      Created by:     Marc Horowitz <marc@athena.mit.edu>
  *
- *      $Id: X_fonts.c 2144 2008-01-21 07:57:32Z kcr $
+ *      $Id: X_fonts.c 2439 2009-04-21 06:21:12Z kcr@ATHENA.MIT.EDU $
  *
  *      Copyright (c) 1989 by the Massachusetts Institute of Technology.
  *      For copying and distribution information, see the file
@@ -14,7 +14,7 @@
 #include <sysdep.h>
 
 #if (!defined(lint) && !defined(SABER))
-static const char rcsid_X_fonts_c[] = "$Id: X_fonts.c 2144 2008-01-21 07:57:32Z kcr $";
+static const char rcsid_X_fonts_c[] = "$Id: X_fonts.c 2439 2009-04-21 06:21:12Z kcr@ATHENA.MIT.EDU $";
 #endif
 
 #include <zephyr/mit-copyright.h>
@@ -35,13 +35,12 @@ static const char rcsid_X_fonts_c[] = "$Id: X_fonts.c 2144 2008-01-21 07:57:32Z
 #include "zwgc.h"
 
 /*
- * font_dict - Lookup cache for fonts (the value pointers are XFontStruct *'s)
+ * font_dict - Lookup cache for fonts (the value pointers are XFontSet's)
  */
 
 static pointer_dictionary family_dict = NULL;
 static pointer_dictionary fontname_dict = NULL;
 static pointer_dictionary fontst_dict = NULL;
-static pointer_dictionary fidst_dict = NULL;
 
 /*
  * {face,size}_to_string - lookup tables for converting {face,size} int
@@ -52,244 +51,199 @@ static string face_to_string[] = { "roman", "bold", "italic", "bolditalic" };
 static string size_to_string[] = { "small", "medium", "large" };
 
 static char *
-get_family(char *style,
-          char *substyle)
+get_family(char *style, char *substyle)
 {
-   char *desc;
-   pointer_dictionary_binding *binding;
-   int exists;
-   char *family;
-
-   desc=string_Concat("style.",style);
-   desc=string_Concat2(desc,".substyle.");
-   desc=string_Concat2(desc,substyle);
-   desc=string_Concat2(desc,".fontfamily");
-
-   if (!family_dict)
-      family_dict = pointer_dictionary_Create(37);
-   binding = pointer_dictionary_Define(family_dict,desc,&exists);
-
-   if (exists) {
-      free(desc);
-      return((string) binding->value);
-   } else {
-#define STYLE_CLASS "StyleKey.Style1.Style2.Style3.SubstyleKey.Substyle.FontfamilyKey"
-      family=get_string_resource(desc,STYLE_CLASS);
-#undef STYLE_CLASS
-      free(desc);
-      if (family==NULL)
-        pointer_dictionary_Delete(family_dict,binding);
-      else
-        binding->value=(pointer) family;
-      return(family);  /* If resource returns NULL, return NULL also */
-   }
+    char *desc;
+    pointer_dictionary_binding *binding;
+    int exists;
+    char *family;
+    
+    desc=string_Concat("style.", style);
+    desc=string_Concat2(desc, ".substyle.");
+    desc=string_Concat2(desc, substyle);
+    desc=string_Concat2(desc, ".fontfamily");
+    
+    if (!family_dict)
+       family_dict = pointer_dictionary_Create(37);
+    binding = pointer_dictionary_Define(family_dict, desc, &exists);
+    
+    if (exists) {
+       free(desc);
+       return((string) binding->value);
+    } else {
+        family = get_string_resource(desc,
+                 "StyleKey.Style1.Style2.Style3.SubstyleKey.Substyle.FontfamilyKey");
+       free(desc);
+       if (family == NULL)
+           pointer_dictionary_Delete(family_dict, binding);
+       else
+           binding->value = (pointer)family;
+       return(family);  /* If resource returns NULL, return NULL also */
+    }
 }
 
 static char *
 get_specific_fontname(char *family,
-                     int size,
-                     int face)
+                      int size,
+                      int face)
 {
-   char *desc;
-   pointer_dictionary_binding *binding;
-   int exists;
-   char *fontname;
-
-   desc = string_Concat("fontfamily.",family);
-   desc = string_Concat2(desc, ".");
-   desc = string_Concat2(desc, size_to_string[size]);
-   desc = string_Concat2(desc, ".");
-   desc = string_Concat2(desc, face_to_string[face]);
-
-   if (!fontname_dict)
-      fontname_dict = pointer_dictionary_Create(37);
-   binding = pointer_dictionary_Define(fontname_dict,desc,&exists);
-
-   if (exists) {
+    char *desc;
+    pointer_dictionary_binding *binding;
+    int exists;
+    char *fontname;
+
+    desc = string_Concat("fontfamily.", family);
+    desc = string_Concat2(desc, ".");
+    desc = string_Concat2(desc, size_to_string[size]);
+    desc = string_Concat2(desc, ".");
+    desc = string_Concat2(desc, face_to_string[face]);
+    
+    if (!fontname_dict)
+       fontname_dict = pointer_dictionary_Create(37);
+    binding = pointer_dictionary_Define(fontname_dict, desc, &exists);
+    
+    if (exists) {
+       free(desc);
+       return (string)binding->value;
+    } else {
+      fontname = get_string_resource(desc, "FontfamilyKey.Fontfamily.Size.Face");
       free(desc);
-      return((string) binding->value);
-   } else {
-#define FAMILY_CLASS "FontfamilyKey.Fontfamily.Size.Face"
-      fontname=get_string_resource(desc,FAMILY_CLASS);
-      free(desc);
-      if (fontname==NULL)
-        pointer_dictionary_Delete(fontname_dict,binding);
+      if (fontname == NULL)
+         pointer_dictionary_Delete(fontname_dict, binding);
       else
-        binding->value=(pointer) fontname;
-      return(fontname);  /* If resource returns NULL, return NULL also */
+         binding->value = (pointer)fontname;
+      return fontname;  /* If resource returns NULL, return NULL also */
    }
 }
 
-/* fast function to convert Font to hex.  Return value
- * is on the heap and must be freed.  I'm cheating in
- * that I know that Font us really an unsigned long. */
-
-static char hexdigits[] = {"0123456789ABCDEF"};
-static char *
-Font_to_hex(Font num)
+static XFontSet
+get_fontst(Display *dpy, char *fontname)
 {
-   char *temp;
-   int i;
-
-   temp=(char *) malloc((sizeof(Font)<<1)+2);
-
-   for (i=0;i<((sizeof(Font)<<1)+1);i++)
-      temp[i] = hexdigits[(num>>(i*4))&0x0f];
-   temp[i] = '\0';
-
-   return(temp);
-}
-
-void
-add_fid(XFontStruct *font)
-{
-   
-   char *fidstr;
    pointer_dictionary_binding *binding;
    int exists;
+   XFontSet fontst;
+   char **missing_list;
+   int missing_count;
+   char *def_string;
 
-   if (!fidst_dict)
-      fidst_dict = pointer_dictionary_Create(37);
-   fidstr=Font_to_hex(font->fid);
-   binding = pointer_dictionary_Define(fidst_dict,fidstr,&exists);
-   free(fidstr);
-
-   if (!exists)
-      binding->value=(pointer) font;
-}
-
-/* requires that the font already be cached. */
-XFontStruct *
-get_fontst_from_fid(Font fid)
-{
-   char *fidstr;
-   pointer_dictionary_binding *binding;
-   int exists;
-
-   fidstr=Font_to_hex(fid);
-
-   binding = pointer_dictionary_Define(fidst_dict,fidstr,&exists);
-   free(fidstr);
-#ifdef DEBUG
-   if (exists) {
-      return((XFontStruct *) binding->value);
-   } else {
-      printf("Font fid=0x%s not cached.  Oops.\n",fidstr);
-      abort();
-   }
-#else
-   return((XFontStruct *) binding->value);
-#endif
-}
+   if (!fontst_dict)
+       fontst_dict = pointer_dictionary_Create(37);
+   binding = pointer_dictionary_Define(fontst_dict, fontname, &exists);
 
-static XFontStruct *
-get_fontst(Display *dpy,
-          char *fontname)
-{
-   pointer_dictionary_binding *binding;
-   int exists;
-   XFontStruct *fontst;
+   if (exists)
+       return((XFontSet)binding->value);
 
-   if (!fontst_dict)
-      fontst_dict = pointer_dictionary_Create(37);
-   binding = pointer_dictionary_Define(fontst_dict,fontname,&exists);
+   fontst = XCreateFontSet(dpy, fontname, &missing_list, &missing_count,
+                          &def_string);
+   XFreeStringList(missing_list);
 
-   if (exists) {
-      return((XFontStruct *) binding->value);
-   } else {
-      fontst=XLoadQueryFont(dpy,fontname);
-      if (fontst==NULL) {
-        pointer_dictionary_Delete(fontst_dict,binding);
-      } else {
-        binding->value=(pointer) fontst;
-        add_fid(fontst);
-      } return(fontst);  /* If resource returns NULL, return NULL also */
-   }
+   if (fontst == NULL)
+       pointer_dictionary_Delete(fontst_dict,binding);
+   else
+       binding->value = (pointer)fontst;
+   
+   return(fontst);  /* If resource returns NULL, return NULL also */
 }
 
 static char *
-get_fontname(char *family,
-            int size,
-            int face)
+get_fontname(char *family, int size, int face)
 {
-   char *fontname;
-
-   if (!(fontname=get_specific_fontname(family,size,face)))
-    if (!(fontname=get_specific_fontname(family,size,ROMAN_FACE)))
-     if (!(fontname=get_specific_fontname(family,MEDIUM_SIZE,face)))
-      fontname=get_specific_fontname(family,MEDIUM_SIZE,ROMAN_FACE);
-   return(fontname);
+    char *fontname;
+
+    fontname = get_specific_fontname(family, size, face);
+    if (!fontname)
+       fontname = get_specific_fontname(family, size, ROMAN_FACE);
+    if (!fontname)
+       fontname = get_specific_fontname(family, MEDIUM_SIZE, face);
+    if (!fontname)
+       fontname = get_specific_fontname(family, MEDIUM_SIZE, ROMAN_FACE);
+    return(fontname);
 }
 
-static XFontStruct *
+static XFontSet
 complete_get_fontst(Display *dpy,
-                   string style,
-                   string substyle,
-                   int size,
-                   int face)
+                    string style,
+                    string substyle,
+                    int size,
+                    int face)
 {
-   char *family,*fontname;
-   XFontStruct *fontst;
-
-   if ((family=get_family(style,substyle)))
-     if ((fontname=get_fontname(family,size,face)))
-       if ((fontst=get_fontst(dpy,fontname)))
-        return(fontst);
-   /* If any part fails, */
-   return(NULL);
+    char *family, *fontname;
+    XFontSet fontst;
+
+    family = get_family(style, substyle);
+    if (!family)
+       return NULL;
+    fontname = get_fontname(family, size, face);
+    if (!fontname)
+       return NULL;
+    fontst = get_fontst(dpy, fontname);
+    if (!fontst)
+       return NULL;
+
+    return fontst;
 }
 
 /*
- *    XFontStruct *get_font(string style, substyle; int size, face)
+ *    XFontSet get_font(string style, substyle; int size, face)
  *         Requires: size is one of SMALL_SIZE, MEDIUM_SIZE, LARGE_SIZE and
  *                   face is one of ROMAN_FACE, BOLD_FACE, ITALIC_FACE,
  *                   BOLDITALIC_FACE.
  *          Effects: unknown
  */
 
-XFontStruct *
+XFontSet
 get_font(Display *dpy,
-        string style,
-        string substyle,
-        int size,
-        int face)
+         string style,
+         string substyle,
+         int size,
+         int face)
 {
    char *family,*fontname;
-   XFontStruct *fontst;
+   XFontSet fontst = NULL;
 
    if (size == SPECIAL_SIZE) {
-      /* attempt to process @font explicitly */
-      if ((fontst = get_fontst(dpy, substyle)))
-       return(fontst);
+       /* attempt to process @font explicitly */
+       fontst = get_fontst(dpy, substyle);
    } else {
-      if ((family = get_family(style, substyle))) {
-        if ((fontname = get_fontname(family, size,face)))
-          if ((fontst = get_fontst(dpy, fontname)))
-            return(fontst);
-      } else {
-        if ((fontname = get_fontname(substyle, size, face)))
-          if ((fontst = get_fontst(dpy, fontname)))
-            return(fontst);
-      }
-
-      /* At this point, the no-failure case didn't happen, and the case
-      of substyle being the fontfamily didn't happen, either. */
-
-      fontst=NULL;
-      if (!(fontst = complete_get_fontst(dpy,style,"text",size,face)))
-       if (!(fontst = complete_get_fontst(dpy,"default",substyle,size,face)))
-         if (!(fontst = complete_get_fontst(dpy,"default","text",size,face)))
-           if ((fontname = get_fontname("default",size,face)))
-             fontst = get_fontst(dpy,fontname);
-      if (fontst) return(fontst);
+       family = get_family(style, substyle);
+
+       if (family)
+          fontname = get_fontname(family, size, face);
+       else
+          fontname = get_fontname(substyle, size, face);
+
+       if (fontname) {
+          fontst = get_fontst(dpy, fontname);
+          if (fontst)
+              return fontst;
+       }
+       
+       /* At this point, the no-failure case didn't happen, and the case
+         of substyle being the fontfamily didn't happen, either. */
+       
+       fontst = complete_get_fontst(dpy, style, "text", size, face);
+       if (!fontst)
+          fontst = complete_get_fontst(dpy, "default", substyle, size, face);
+       if (!fontst)
+          fontst = complete_get_fontst(dpy, "default", "text", size, face);
+       if (!fontst) {
+          fontname = get_fontname("default", size, face);
+          if (fontname)
+              fontst = get_fontst(dpy, fontname);
+       }
    }
-
+   if (fontst)
+       return fontst;
+   
    /* If all else fails, try fixed */
 
-   if ((fontst=get_fontst(dpy,"fixed"))) return(fontst);
-
+   fontst = get_fontst(dpy, "fixed");
+   
+   if (fontst)
+       return fontst;
+   
    /* No fonts available.  Die. */
-
+   
    ERROR("Unable to open font \"fixed\".  Aborting...");
 #ifdef DEBUG
    abort();
@@ -299,4 +253,3 @@ get_font(Display *dpy,
 }
 
 #endif /* X_DISPLAY_MISSING */
-