unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Need `truncate-string-to-pixel-width` and `glyph-pixel-width` functions in C
@ 2024-10-23  5:01 Jimmy Yuen Ho Wong
  2024-10-23  8:01 ` Eli Zaretskii
  0 siblings, 1 reply; 17+ messages in thread
From: Jimmy Yuen Ho Wong @ 2024-10-23  5:01 UTC (permalink / raw)
  To: Emacs-Devel devel

[-- Attachment #1: Type: text/plain, Size: 1815 bytes --]

Dear emacs-devel,

Recently I've been trying to mold Corfu
<https://github.com/minad/corfu/pull/508> to render every string in every
face in pixel precision but I've run into some slight performance issues
when truncating strings. The motivation for this is
`truncate-string-to-width` not only does not speak pixels, but also doesn't
understand composed characters such as emojis. It just chops off the emoji
byte sequence in the middle as described in the PR, so I had to write a
custom `truncate-string-to-pixel-width` function using `string-glyph-split`
and `string-pixel-width` to measure character widths, which seems... silly.

I've looked into how to get the width of a glyph from a font object by
employing some dark magic of undocumented internal functions and wrongly
documented functions such as `char-displayable-p`, `font-info`,
`lglyth-width`, `lgstring-glyph`, `open-font` etc in combination of
`composition-get-gstring`, which is correct and fast enough.... for glyph
strings with no faces. Then I looked into reverse engineering the face font
selection process, which quickly pushed the run time up 2 orders of
magnitude due to the anonymous face + face attribute inheritance + face
lists madness. Then when I realized I still didn't deal with display text
properties, I threw my hands up.

It'd be really nice if we could have a really performant C function that
can truncate strings correctly and preferably in pixel precision.
Alternatively, a `glyph-pixel-width` that implements a fast path in C
that's somewhat akin to the process I described above, but also handles
display text properties correctly would be nice.

I don't really know enough about Emacs C internals WRT to font rendering to
implement this so I'm just throwing this idea out there.

Does this make sense?

Jimmy Yuen Ho Wong

[-- Attachment #2: Type: text/html, Size: 2224 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2024-10-28 20:21 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-23  5:01 Need `truncate-string-to-pixel-width` and `glyph-pixel-width` functions in C Jimmy Yuen Ho Wong
2024-10-23  8:01 ` Eli Zaretskii
2024-10-23 13:52   ` Jimmy Yuen Ho Wong
2024-10-23 17:39     ` Eli Zaretskii
2024-10-23 20:03       ` Jimmy Yuen Ho Wong
2024-10-24  9:55         ` Eli Zaretskii
2024-10-24 14:26           ` Jimmy Yuen Ho Wong
2024-10-24 14:39             ` Eli Zaretskii
2024-10-24 15:33               ` Jimmy Yuen Ho Wong
2024-10-24 16:02                 ` Eli Zaretskii
2024-10-24 16:49                   ` Jimmy Yuen Ho Wong
2024-10-24 17:56                     ` Eli Zaretskii
2024-10-24 21:11                       ` Jimmy Yuen Ho Wong
2024-10-25  7:21                         ` Eli Zaretskii
2024-10-25 13:35                           ` Jimmy Yuen Ho Wong
2024-10-25 15:11                             ` Eli Zaretskii
2024-10-28 20:21                               ` Jimmy Yuen Ho Wong

Code repositories for project(s) associated with this public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).