2002-07-03 Andrew Choi <akochoi@shaw.ca>
authorAndrew Choi <akochoi@shaw.ca>
Thu, 4 Jul 2002 02:43:48 +0000 (02:43 +0000)
committerAndrew Choi <akochoi@shaw.ca>
Thu, 4 Jul 2002 02:43:48 +0000 (02:43 +0000)
        * macterm.c (x_list_fonts): Fix comment.  Cache fonts matching
        pattern.  Search cache first.

src/ChangeLog
src/macterm.c

index 23e7681..91186f6 100644 (file)
@@ -1,7 +1,9 @@
 2002-07-03  Andrew Choi  <akochoi@shaw.ca>
 
-       * macterm.c (init_font_name_table): Also add entry for
-       jisx0201.1976-0 coding for Japanese font.
+       * macterm.c (x_list_fonts): Fix comment.  Cache fonts matching
+       pattern.  Search cache first.
+       (init_font_name_table): Also add entry for jisx0201.1976-0 coding
+       for Japanese font.
        (XLoadQueryFont): Use it.
 
 2002-07-02  Richard M. Stallman  <rms@gnu.org>
index 728f733..7885f6c 100644 (file)
@@ -10860,11 +10860,9 @@ init_font_name_table ()
 
 
 /* Return a list of at most MAXNAMES font specs matching the one in
-   PATTERN.  Note that each '*' in the PATTERN matches exactly one
-   field of the font spec, unlike X in which an '*' in a font spec can
-   match a number of fields.  The result is in the Mac implementation
-   all fonts must be specified by a font spec with all 13 fields
-   (although many of these can be "*'s").  */
+   PATTERN.  Cache matching fonts for patterns in
+   dpyinfo->name_list_element to avoid looking them up again by
+   calling mac_font_pattern_match (slow).  */
 
 Lisp_Object
 x_list_fonts (struct frame *f,
@@ -10873,14 +10871,28 @@ x_list_fonts (struct frame *f,
               int maxnames)
 {
   char *ptnstr;
-  Lisp_Object newlist = Qnil;
+  Lisp_Object newlist = Qnil, tem, key;
   int n_fonts = 0;
   int i;
   struct gcpro gcpro1, gcpro2;
+  struct mac_display_info *dpyinfo = f ? FRAME_MAC_DISPLAY_INFO (f) : NULL;
 
   if (font_name_table == NULL)  /* Initialize when first used.  */
     init_font_name_table ();
 
+  if (dpyinfo)
+    {
+      tem = XCDR (dpyinfo->name_list_element);
+      key = Fcons (pattern, make_number (maxnames));
+
+      newlist = Fassoc (key, tem);
+      if (!NILP (newlist))
+       {
+         newlist = Fcdr_safe (newlist);
+         goto label_cached;
+       }
+    }
+
   ptnstr = XSTRING (pattern)->data;
 
   GCPRO2 (pattern, newlist);
@@ -10902,6 +10914,14 @@ x_list_fonts (struct frame *f,
 
   UNGCPRO;
 
+  if (dpyinfo)
+    {
+      XSETCDR (dpyinfo->name_list_element,
+              Fcons (Fcons (key, newlist),
+                     XCDR (dpyinfo->name_list_element)));
+    }
+ label_cached:
+  
   return newlist;
 }