bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same fa


From: Jan D.
Subject: bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes
Date: Mon, 9 Feb 2015 15:58:30 +0100

Commited.

> 7 feb 2015 kl. 09:28 skrev Dima Kogan <dima@secretsauce.net>:
> 
> Jan D. <jan.h.d@swipnet.se> writes:
> 
>> Can you add ChangeLog entries for this so we can install it?
> 
> Attached. Let me know if there are issues with the changelog style.

Many, I rewrote them.

        Jan D.

> Also, I'm including everything in one patch. It was mostly like that
> already.
> 
>> From 2380816e2160236b35f06eed63839f5e71280686 Mon Sep 17 00:00:00 2001
> From: Dima Kogan <dima@secretsauce.net>
> Date: Tue, 30 Dec 2014 20:05:11 -0800
> Subject: [PATCH] scalable font logic now matches the docs and is more
> consistent
> 
> A nil value of scalable-fonts-allowed allows scalable fonts if no others
> were found.  This is the previously-documented behavior.
> 
> realize_basic_faces() no longer forces scalable-fonts-allowed to t.  If
> nil, some fonts will always be found even if only scalable fonts are
> available, as set by the other part of this patch.
> ---
> src/ChangeLog |   8 +++
> src/font.c    |   1 -
> src/xfaces.c  |   3 -
> src/xfont.c   | 173 ++++++++++++++++++++++++++++++++--------------------------
> 4 files changed, 104 insertions(+), 81 deletions(-)
> 
> diff --git a/src/ChangeLog b/src/ChangeLog
> index cd72f98..d189b7e 100644
> --- a/src/ChangeLog
> +++ b/src/ChangeLog
> @@ -1,3 +1,11 @@
> +2015-02-07  Dima Kogan  <dima@secretsauce.net>
> +
> +     * xfont.c (xfont_list_pattern):
> +     * xfaces.c (realize_basic_faces):
> +     * font.c (font_score): scalable font logic now matches the docs
> +     and is more consistent
> +     Fixes: bug#19117
> +
> 2015-02-07  Paul Eggert  <eggert@cs.ucla.edu>
> 
>       Remove no-longer-used cursor_in_echo_area code
> diff --git a/src/font.c b/src/font.c
> index 9ea43cd..b2b43c7 100644
> --- a/src/font.c
> +++ b/src/font.c
> @@ -2136,7 +2136,6 @@ font_score (Lisp_Object entity, Lisp_Object *spec_prop)
>       }
> 
>   /* Score the size.  Maximum difference is 127.  */
> -  i = FONT_SIZE_INDEX;
>   if (! NILP (spec_prop[FONT_SIZE_INDEX])
>       && XINT (AREF (entity, FONT_SIZE_INDEX)) > 0)
>     {
> diff --git a/src/xfaces.c b/src/xfaces.c
> index 6e01ab0..d0fe872 100644
> --- a/src/xfaces.c
> +++ b/src/xfaces.c
> @@ -5141,12 +5141,10 @@ static bool
> realize_basic_faces (struct frame *f)
> {
>   bool success_p = false;
> -  ptrdiff_t count = SPECPDL_INDEX ();
> 
>   /* Block input here so that we won't be surprised by an X expose
>      event, for instance, without having the faces set up.  */
>   block_input ();
> -  specbind (Qscalable_fonts_allowed, Qt);
> 
>   if (realize_default_face (f))
>     {
> @@ -5180,7 +5178,6 @@ realize_basic_faces (struct frame *f)
>       success_p = true;
>     }
> 
> -  unbind_to (count, Qnil);
>   unblock_input ();
>   return success_p;
> }
> diff --git a/src/xfont.c b/src/xfont.c
> index 3a0f5e3..5f1c61c 100644
> --- a/src/xfont.c
> +++ b/src/xfont.c
> @@ -388,94 +388,113 @@ xfont_list_pattern (Display *display, const char 
> *pattern,
>       Lisp_Object *props = XVECTOR (xfont_scratch_props)->contents;
>       Lisp_Object scripts = Qnil, entity = Qnil;
> 
> +      /* We take two passes over the font list.  The second pass is
> +         taken only if scalable-fonts-allowed is nil, and only
> +         scalable fonts were found.
> +       */
> +      int i_pass;
> +      bool skipped_some_scalable_fonts = false;
> +
>       for (i = 0; i < ASIZE (xfont_scratch_props); i++)
>       ASET (xfont_scratch_props, i, Qnil);
>       for (i = 0; i < num_fonts; i++)
>       indices[i] = names[i];
>       qsort (indices, num_fonts, sizeof (char *), compare_font_names);
> 
> -      for (i = 0; i < num_fonts; i++)
> -     {
> -       ptrdiff_t len;
> +      for (i_pass = 0; i_pass < 2; i_pass++)
> +        {
> +          for (i = 0; i < num_fonts; i++)
> +            {
> +              ptrdiff_t len;
> 
> -       if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0)
> -         continue;
> -       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;
> -       ASET (entity, FONT_TYPE_INDEX, Qx);
> -       /* Avoid auto-scaled fonts.  */
> -       if (INTEGERP (AREF (entity, FONT_DPI_INDEX))
> -           && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX))
> -           && XINT (AREF (entity, FONT_DPI_INDEX)) != 0
> -           && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0)
> -         continue;
> -       /* Avoid not-allowed scalable fonts.  */
> -       if (NILP (Vscalable_fonts_allowed))
> -         {
> -           int size = 0;
> +              if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0)
> +                continue;
> +              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;
> +              ASET (entity, FONT_TYPE_INDEX, Qx);
> +              /* Avoid auto-scaled fonts.  */
> +              if (INTEGERP (AREF (entity, FONT_DPI_INDEX))
> +                  && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX))
> +                  && XINT (AREF (entity, FONT_DPI_INDEX)) != 0
> +                  && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0)
> +                continue;
> +              /* Avoid not-allowed scalable fonts.  */
> +              if (NILP (Vscalable_fonts_allowed))
> +                {
> +                  int size = 0;
> 
> -           if (INTEGERP (AREF (entity, FONT_SIZE_INDEX)))
> -             size = XINT (AREF (entity, FONT_SIZE_INDEX));
> -           else if (FLOATP (AREF (entity, FONT_SIZE_INDEX)))
> -             size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX));
> -           if (size == 0)
> -             continue;
> -         }
> -       else if (CONSP (Vscalable_fonts_allowed))
> -         {
> -           Lisp_Object tail, elt;
> +                  if (INTEGERP (AREF (entity, FONT_SIZE_INDEX)))
> +                    size = XINT (AREF (entity, FONT_SIZE_INDEX));
> +                  else if (FLOATP (AREF (entity, FONT_SIZE_INDEX)))
> +                    size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX));
> +                  if (size == 0 && i_pass == 0)
> +                    {
> +                      skipped_some_scalable_fonts = true;
> +                      continue;
> +                    }
> +                }
> +              else if (CONSP (Vscalable_fonts_allowed))
> +                {
> +                  Lisp_Object tail, elt;
> 
> -           for (tail = Vscalable_fonts_allowed; CONSP (tail);
> -                tail = XCDR (tail))
> -             {
> -               elt = XCAR (tail);
> -               if (STRINGP (elt)
> -                   && fast_c_string_match_ignore_case (elt, indices[i],
> -                                                       len) >= 0)
> -                 break;
> -             }
> -           if (! CONSP (tail))
> -             continue;
> -         }
> +                  for (tail = Vscalable_fonts_allowed; CONSP (tail);
> +                       tail = XCDR (tail))
> +                    {
> +                      elt = XCAR (tail);
> +                      if (STRINGP (elt)
> +                          && fast_c_string_match_ignore_case (elt, 
> indices[i],
> +                                                              len) >= 0)
> +                        break;
> +                    }
> +                  if (! CONSP (tail))
> +                    continue;
> +                }
> 
> -       /* Avoid fonts of invalid registry.  */
> -       if (NILP (AREF (entity, FONT_REGISTRY_INDEX)))
> -         continue;
> +              /* Avoid fonts of invalid registry.  */
> +              if (NILP (AREF (entity, FONT_REGISTRY_INDEX)))
> +                continue;
> 
> -       /* Update encoding and repertory if necessary.  */
> -       if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX)))
> -         {
> -           registry = AREF (entity, FONT_REGISTRY_INDEX);
> -           if (font_registry_charsets (registry, &encoding, &repertory) < 0)
> -             encoding = NULL;
> -         }
> -       if (! encoding)
> -         /* Unknown REGISTRY, not supported.  */
> -         continue;
> -       if (repertory)
> -         {
> -           if (NILP (script)
> -               || xfont_chars_supported (chars, NULL, encoding, repertory))
> -             list = Fcons (entity, list), entity = Qnil;
> -           continue;
> -         }
> -       if (memcmp (props, aref_addr (entity, FONT_FOUNDRY_INDEX),
> -                   word_size * 7)
> -           || ! EQ (AREF (entity, FONT_SPACING_INDEX), props[7]))
> -         {
> -           vcopy (xfont_scratch_props, 0,
> -                  aref_addr (entity, FONT_FOUNDRY_INDEX), 7);
> -           ASET (xfont_scratch_props, 7, AREF (entity, FONT_SPACING_INDEX));
> -           scripts = xfont_supported_scripts (display, indices[i],
> -                                              xfont_scratch_props, encoding);
> -         }
> -       if (NILP (script)
> -           || ! NILP (Fmemq (script, scripts)))
> -         list = Fcons (entity, list), entity = Qnil;
> -     }
> +              /* Update encoding and repertory if necessary.  */
> +              if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX)))
> +                {
> +                  registry = AREF (entity, FONT_REGISTRY_INDEX);
> +                  if (font_registry_charsets (registry, &encoding, 
> &repertory) < 0)
> +                    encoding = NULL;
> +                }
> +              if (! encoding)
> +                /* Unknown REGISTRY, not supported.  */
> +                continue;
> +              if (repertory)
> +                {
> +                  if (NILP (script)
> +                      || xfont_chars_supported (chars, NULL, encoding, 
> repertory))
> +                    list = Fcons (entity, list), entity = Qnil;
> +                  continue;
> +                }
> +              if (memcmp (props, aref_addr (entity, FONT_FOUNDRY_INDEX),
> +                          word_size * 7)
> +                  || ! EQ (AREF (entity, FONT_SPACING_INDEX), props[7]))
> +                {
> +                  vcopy (xfont_scratch_props, 0,
> +                         aref_addr (entity, FONT_FOUNDRY_INDEX), 7);
> +                  ASET (xfont_scratch_props, 7, AREF (entity, 
> FONT_SPACING_INDEX));
> +                  scripts = xfont_supported_scripts (display, indices[i],
> +                                                     xfont_scratch_props, 
> encoding);
> +                }
> +              if (NILP (script)
> +                  || ! NILP (Fmemq (script, scripts)))
> +                list = Fcons (entity, list), entity = Qnil;
> +            }
> +
> +          /* We skip the second pass unless we really need it.  */
> +          if (!                                 /* Loop again if... */
> +              (NILP (list)                      /*   No fonts found on the 
> first pass */
> +               && skipped_some_scalable_fonts)) /*   and we skipped some 
> scalable ones.  */
> +            break;
> +        }
>       XFreeFontNames (names);
>     }
> 
> -- 
> 2.1.4
> 






reply via email to

[Prev in Thread] Current Thread [Next in Thread]