]> git.eshelyaron.com Git - emacs.git/commitdiff
Attempt to allocate less font entity objects in xfont_list_pattern
authorDmitry Antipov <dmantipov@yandex.ru>
Fri, 14 Nov 2014 10:40:24 +0000 (13:40 +0300)
committerDmitry Antipov <dmantipov@yandex.ru>
Fri, 14 Nov 2014 10:40:24 +0000 (13:40 +0300)
* xfont.c (xfont_list_pattern): Do not allocate font entity object
for each candidate font but attempt to reuse it from previous improper
candidate, if any.

src/ChangeLog
src/xfont.c

index 2be24fa851b45966062a984d81426916af2d9ed8..6f105ead8116ee3b58c09fa18267492315dad58c 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-14  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * xfont.c (xfont_list_pattern): Do not allocate font entity object
+       for each candidate font but attempt to reuse it from previous improper
+       candidate, if any.
+
 2014-11-13  Paul Eggert  <eggert@cs.ucla.edu>
 
        Avoid undefined behavior in color table hashing.
        functions in Vselection_converter_alist (Bug#18911).
        (syms_of_nsselect): Remove Vselection_converter_alist.
 
-(2014-10-31  Dmitry Antipov  <dmantipov@yandex.ru>
+2014-10-31  Dmitry Antipov  <dmantipov@yandex.ru>
 
        * font.c (copy_font_spec): Redesign to avoid Fcopy_alist
        and unnecessary initialization.  Adjust comments.
index 5e8dd370120997e1eef9d483dda439f066f29e9e..06a4479436416e31c225521027628bd9afc327d2 100644 (file)
@@ -386,7 +386,7 @@ xfont_list_pattern (Display *display, const char *pattern,
     {
       char **indices = alloca (sizeof (char *) * num_fonts);
       Lisp_Object *props = XVECTOR (xfont_scratch_props)->contents;
-      Lisp_Object scripts = Qnil;
+      Lisp_Object scripts = Qnil, entity = Qnil;
 
       for (i = 0; i < ASIZE (xfont_scratch_props); i++)
        ASET (xfont_scratch_props, i, Qnil);
@@ -397,11 +397,11 @@ xfont_list_pattern (Display *display, const char *pattern,
       for (i = 0; i < num_fonts; i++)
        {
          ptrdiff_t len;
-         Lisp_Object entity;
 
          if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0)
            continue;
-         entity = font_make_entity ();
+         if (NILP (entity))
+           entity = font_make_entity ();
          len = xfont_decode_coding_xlfd (indices[i], -1, buf);
          if (font_parse_xlfd (buf, len, entity) < 0)
            continue;
@@ -459,7 +459,7 @@ xfont_list_pattern (Display *display, const char *pattern,
            {
              if (NILP (script)
                  || xfont_chars_supported (chars, NULL, encoding, repertory))
-               list = Fcons (entity, list);
+               list = Fcons (entity, list), entity = Qnil;
              continue;
            }
          if (memcmp (props, aref_addr (entity, FONT_FOUNDRY_INDEX),
@@ -474,7 +474,7 @@ xfont_list_pattern (Display *display, const char *pattern,
            }
          if (NILP (script)
              || ! NILP (Fmemq (script, scripts)))
-           list = Fcons (entity, list);
+           list = Fcons (entity, list), entity = Qnil;
        }
       XFreeFontNames (names);
     }