all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Jan D." <jan.h.d@swipnet.se>
To: Dima Kogan <dima@secretsauce.net>
Cc: 19117@debbugs.gnu.org
Subject: bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes
Date: Sat, 7 Feb 2015 08:24:26 +0100	[thread overview]
Message-ID: <E6D33F22-BB4B-4B36-8432-FAB3C869FAFC@swipnet.se> (raw)
In-Reply-To: <87r3u4gked.fsf@secretsauce.net>

Hi.

There is a Dmitriy Kogan in the copyright list.  Is that you?

	Jan D.

> 5 feb 2015 kl. 21:41 skrev Dima Kogan <dima@secretsauce.net>:
> 
> Jan D. <jan.h.d@swipnet.se> writes:
> 
>> 
>> But the comment here:
>> 
>> +          /* We skip the second pass unless we really need it.  */
>> +          if (!(NILP (list)                      /* No fonts found on 
>> the first pass */
>> +                && skipped_some_scalable_fonts)) /* and we skipped some 
>> scalable ones.  */
>> +            break;
>> 
>> 
>> looks like it really should be  /* Fonts found on the first pass */
> 
> There was an ! there, so it made it unclear what the comment is
> referring to. Attaching new patches that apply against the current
> master, and have a clarified comment in that place
> 
>> From 4e895fb38c84342021b602dd4a9830b55fe56a58 Mon Sep 17 00:00:00 2001
> From: Dima Kogan <dima@secretsauce.net>
> Date: Tue, 30 Dec 2014 20:05:11 -0800
> Subject: [PATCH 1/2] 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/xfaces.c |   3 --
> src/xfont.c  | 173 +++++++++++++++++++++++++++++++++--------------------------
> 2 files changed, 96 insertions(+), 80 deletions(-)
> 
> 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
> 
>> From 80bdfb936f9dd24fd8bb0ce0aecc10f796dd4f6f Mon Sep 17 00:00:00 2001
> From: Dima Kogan <dima@secretsauce.net>
> Date: Tue, 30 Dec 2014 20:05:58 -0800
> Subject: [PATCH 2/2] removed unused variable assignment
> 
> ---
> src/font.c | 1 -
> 1 file changed, 1 deletion(-)
> 
> 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)
>     {
> -- 
> 2.1.4
> 






  reply	other threads:[~2015-02-07  7:24 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-20  6:13 bug#19117: 25.0.50; emacs on x11 chooses different fonts for the same face sometimes Dima Kogan
2014-11-20 16:10 ` Eli Zaretskii
2014-12-07  7:28   ` Dima Kogan
2014-12-07 16:12     ` Eli Zaretskii
2014-12-17  5:36       ` Dima Kogan
2014-12-17  6:57         ` Dima Kogan
2014-12-18 16:24           ` Eli Zaretskii
2014-12-20  8:08             ` Jan Djärv
2014-12-19 15:28           ` Dmitry Antipov
2014-12-19 22:46             ` Dima Kogan
2014-12-22  8:01               ` Dmitry Antipov
2014-12-22  8:28               ` Jan Djärv
2014-12-26 19:43                 ` Dima Kogan
2014-12-27  2:17                   ` Stefan Monnier
2014-12-27  9:17                     ` Dima Kogan
2014-12-30  9:44                     ` Dima Kogan
2014-12-30 16:57                       ` Stefan Monnier
2014-12-30 18:33                         ` Dima Kogan
2014-12-30 20:05                           ` Eli Zaretskii
2014-12-31  4:06                             ` Dima Kogan
2015-01-02  9:43                               ` Eli Zaretskii
2015-01-02 21:07                                 ` Dima Kogan
2015-02-02  8:10                                   ` Dima Kogan
2015-02-03 17:53                                     ` Stefan Monnier
2015-02-05  2:41                                       ` handa
2015-02-15 13:47                                         ` K. Handa
2015-02-05 15:08                                       ` Jan D.
2015-02-05 20:41                                         ` Dima Kogan
2015-02-07  7:24                                           ` Jan D. [this message]
2015-02-07  7:59                                           ` Jan D.
2015-02-07  8:28                                             ` Dima Kogan
2015-02-09 14:58                                               ` Jan D.

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E6D33F22-BB4B-4B36-8432-FAB3C869FAFC@swipnet.se \
    --to=jan.h.d@swipnet.se \
    --cc=19117@debbugs.gnu.org \
    --cc=dima@secretsauce.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.