Subject: Re: bug#77042: 31.0.50; `string-pixel-width' could return wrong results with alternative properties

From: Eli Zaretskii <[email-masked]>
Date: Sun, 16 Mar 2025 09:31:17 +0200

> Date: Sat, 15 Mar 2025 23:43:33 +0100
> From:  David Ponce via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <[email-masked]>
> 
> (let ((text0 (propertize "This text" 'face 'variable-pitch))
>        (text1 (propertize "This text" 'my-face 'variable-pitch)))
>    (with-temp-buffer
>      (setq-local char-property-alias-alist '((face my-face)))
>      (list
>       (string-pixel-width text0 (current-buffer))
>       (string-pixel-width text1 (current-buffer)))))
> 
> Normally the result should be a list of two identical numbers.  But,
> on my config, the result is (89 117) instead of expected (89 89).
> 
> This problem is similar to the already solved case with
> `face-remapping-alist', as is the solution.
>                          
> I propose the attached patch to fix this and slightly simplify the
> code.  On my configuration, the new code has no significant impact on
> performance.

Thanks, please see some comments below.

> +      ;; Setup current buffer to correctly compute pixel width.
> +      (when buffer
> +        (if (local-variable-p 'face-remapping-alist buffer)
> +            (setq-local face-remapping-alist
> +                        (buffer-local-value 'face-remapping-alist
> +                                            buffer)))
> +        (if (local-variable-p 'char-property-alias-alist buffer)
> +            (setq-local char-property-alias-alist
> +                        (buffer-local-value 'char-property-alias-alist
> +                                            buffer))))

What about default-text-properties? shouldn't it get the same
treatment?

> -      (add-text-properties
> -       (point-min) (point-max) '(display-line-numbers-disable t))
> -      ;; Prefer `remove-text-properties' to `propertize' to avoid
> -      ;; creating a new string on each call.
> -      (remove-text-properties
> -       (point-min) (point-max) '(line-prefix nil wrap-prefix nil))
> -      (setq line-prefix nil wrap-prefix nil)
> +      (add-text-properties (point-min) (point-max)
> +                           '( display-line-numbers-disable t
> +                              line-prefix "" wrap-prefix ""))

What is the rationale for this hunk?  Was there any problem with the
original code?

In any case, please don't leave a space after an opening parenthesis.