all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Vasilij Schneidermann <mail@vasilij.de>
Cc: cpitclaudel@gmail.com, alan@idiocy.org, pipcet@gmail.com,
	emacs-devel@gnu.org
Subject: Re: Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY))
Date: Sat, 23 May 2020 16:04:54 +0300	[thread overview]
Message-ID: <83sgfqzts9.fsf@gnu.org> (raw)
In-Reply-To: <20200523112412.GA30384@odonien.localdomain> (message from Vasilij Schneidermann on Sat, 23 May 2020 13:24:12 +0200)

> Date: Sat, 23 May 2020 13:24:12 +0200
> From: Vasilij Schneidermann <mail@vasilij.de>
> Cc: emacs-devel@gnu.org, pipcet@gmail.com, cpitclaudel@gmail.com,
> 	alan@idiocy.org
> 
> Out of curiosity, is this the same reason why font fallback is
> handled on a per-script basis for most cases and with carefully
> chosen ranges for emoji?  I see a similar problem there, with
> updates being necessary for every Unicode release.

No, our font selection machinery is completely separate from text
shaping, and is also agnostic to character compositions.  Basically,
we have a char-table (the one set-fontset-font manipulates) which
provides the various fonts to try for every given character, and some
very convoluted code (see fontset.c) that implements the logic of how
to try the fonts and which fonts to prefer for a character.  IOW, the
font selection is basically per-character and not per-script.

The relation to emoji is that emoji _sequences_ need character
composition, and Emacs currently cannot compose characters that aren't
supported by the same font.  This _is_ related to ligatures etc., as
it indeed touches on one of the basic premises of the display engine's
iteration through buffer text: we stop wherever the 'face' property of
characters changes (and the font is one attribute of the face), then
continue after loading and realizing the new face.  This is why you
see strange artifacts when you press and hold Shift, and then move
with arrow keys across the Arabic line in etc/HELLO: the shaping of
adjacent characters breaks because we pass only part of the text to
the shaper.  This is another bug that cannot be fixed cleanly while
keeping the current design of the display engine and its low-level
method of iteration through text and of producing glyphs.

> Given your previous explanation, a regex-based approach heuristic is the best
> we can hope for then.  From what I understand the display engine uses a
> rectangular grid, not unlike what terminal emulators do.

It uses a rectangular array of glyphs, not a rectangular grid.  The
difference is that glyphs can have variable metrics, which breaks the
grid concept.  IOW, the glyph at coordinates (i, j) in the array and
the glyph at (i, j+1) are not necessarily one above the other on
display.

> Are there any tricks
> to steal from existing terminal emulators?  For example there is an open pull
> request [1] for alacritty using Harfbuzz and FreeType for ligature support.

I cannot claim I understood well enough what this attempts to do, but
I don't think this is our problem in Emacs.  It is not a problem of
layout per se -- Emacs is well equipped to deal with layout of glyphs
and grapheme clusters that have wildly different metrics (recall that
we are able to lay out images of more-or-less arbitrary dimensions on
the same line as simple text).  The problem is that we make the layout
decisions as soon as we have the glyph metrics, on the fly, for each
"thing" we need to display.  HarfBuzz people would like us to send
them the entire paragraph of text, then get it back as a series of
glyphs, then make the layout decisions based on that.  This would need
entirely different algorithms, if not also different data structures;
for starters, we'd need to know how to find the paragraph(s) that will
end up on display without first trying to display them.  And all our
redisplay shortcuts and optimizations implicitly also assume the
current basic iteration, one character at a time, which can be started
at any arbitrary buffer position.

> The greatest challenge I see with redesigning the display engine is supporting
> textual terminals.

Really?  Why do you think this to be the greatest challenge?  For any
model of the display we will come up, TTY frames will always be a
proper subset, no?



  reply	other threads:[~2020-05-23 13:04 UTC|newest]

Thread overview: 145+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-17 10:41 Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY) Julius Pfrommer
2020-05-17 14:09 ` Arthur Miller
2020-05-17 14:30   ` Eli Zaretskii
2020-05-17 15:06     ` Arthur Miller
2020-05-17 15:56       ` Eli Zaretskii
2020-05-17 16:50         ` Arthur Miller
2020-05-17 17:06           ` Eli Zaretskii
2020-05-17 14:35 ` Eli Zaretskii
2020-05-17 14:59   ` Julius Pfrommer
2020-05-17 15:55     ` Eli Zaretskii
2020-05-17 16:28       ` Pip Cet
2020-05-17 17:00         ` Eli Zaretskii
2020-05-17 18:50           ` Pip Cet
2020-05-17 19:17             ` Eli Zaretskii
2020-05-18 16:08               ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Eli Zaretskii
2020-05-18 16:45                 ` tomas
2020-05-18 16:49                   ` Eli Zaretskii
2020-05-18 17:05                 ` Ligatures Stefan Monnier
2020-05-18 17:18                   ` Ligatures Eli Zaretskii
2020-05-18 19:19                     ` Ligatures Pip Cet
2020-05-18 19:25                       ` Ligatures tomas
2020-05-18 19:41                         ` Ligatures Pip Cet
2020-05-18 20:20                           ` Ligatures tomas
2020-05-18 19:33                       ` Ligatures Eli Zaretskii
2020-05-18 19:44                         ` Ligatures Clément Pit-Claudel
2020-05-19  2:25                           ` Ligatures Eli Zaretskii
2020-05-19  2:44                             ` Ligatures Clément Pit-Claudel
2020-05-19 13:59                               ` Ligatures Eli Zaretskii
2020-05-19 14:35                                 ` Ligatures Clément Pit-Claudel
2020-05-19 15:21                                   ` Ligatures Eli Zaretskii
2020-05-19 15:44                                     ` Ligatures Clément Pit-Claudel
2020-05-19 16:15                                       ` Ligatures Eli Zaretskii
2020-05-19 15:36                                 ` Ligatures Tassilo Horn
2020-05-19 16:08                                   ` Ligatures Eli Zaretskii
2020-05-19 16:14                                   ` Ligatures Stefan Monnier
2020-05-19  3:47                             ` Ligatures Stefan Monnier
2020-05-19  4:51                               ` Ligatures Clément Pit-Claudel
2020-05-18 19:38                       ` Ligatures Clément Pit-Claudel
2020-05-19 14:55                         ` Ligatures Pip Cet
2020-05-19 15:30                           ` Ligatures Clément Pit-Claudel
2020-05-19 15:52                             ` Ligatures Pip Cet
2020-05-18 17:24                   ` Ligatures tomas
2020-05-18 17:41                     ` Ligatures Eli Zaretskii
2020-05-18 19:07                       ` Ligatures tomas
2020-05-18 19:17                         ` Ligatures Eli Zaretskii
2020-05-18 20:33                     ` Ligatures Stefan Monnier
2020-05-18 17:31                 ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Clément Pit-Claudel
2020-05-18 17:39                   ` Eli Zaretskii
2020-05-18 19:01                     ` Clément Pit-Claudel
2020-05-18 19:15                       ` Eli Zaretskii
2020-05-18 19:18                       ` tomas
2020-05-18 20:37                       ` Ligatures Stefan Monnier
2020-05-18 21:59                       ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Alan Third
2020-05-19 13:56                         ` Eli Zaretskii
2020-05-19 14:39                           ` Clément Pit-Claudel
2020-05-19 21:43                             ` Pip Cet
2020-05-20  1:41                               ` Clément Pit-Claudel
2020-05-20  2:07                               ` Ligatures Stefan Monnier
2020-05-20  7:14                               ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) tomas
2020-05-20 15:18                               ` Eli Zaretskii
2020-05-20 17:31                                 ` Clément Pit-Claudel
2020-05-20 18:01                                   ` Eli Zaretskii
2020-05-20 18:33                                     ` Clément Pit-Claudel
2020-05-20 18:49                                       ` Eli Zaretskii
2020-05-20 18:53                                         ` Clément Pit-Claudel
2020-05-20 19:02                                           ` Eli Zaretskii
2020-05-20 23:19                                   ` Ligatures Stefan Monnier
2020-05-21 10:01                                 ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Pip Cet
2020-05-21 14:11                                   ` Eli Zaretskii
2020-05-21 16:26                                     ` Pip Cet
2020-05-21 19:08                                       ` Eli Zaretskii
2020-05-21 20:51                                         ` Clément Pit-Claudel
2020-05-21 21:16                                           ` Pip Cet
2020-05-22  6:12                                             ` Eli Zaretskii
2020-05-22  9:25                                               ` Pip Cet
2020-05-22 11:23                                                 ` Eli Zaretskii
2020-05-22 12:52                                                   ` Pip Cet
2020-05-22 13:15                                                     ` Eli Zaretskii
2020-05-22 13:29                                                       ` Clément Pit-Claudel
2020-05-22 14:30                                                         ` Eli Zaretskii
2020-05-22 14:34                                                           ` Clément Pit-Claudel
2020-05-22 19:01                                                             ` Eli Zaretskii
2020-05-22 19:33                                                               ` Clément Pit-Claudel
2020-05-22 19:44                                                                 ` Eli Zaretskii
2020-05-22 20:02                                                                   ` Clément Pit-Claudel
     [not found]                                                                     ` <83mu5z171j.fsf@gnu.org>
2020-05-23 14:34                                                                       ` Clément Pit-Claudel
2020-05-23 16:18                                                                         ` Eli Zaretskii
2020-05-23 16:37                                                                           ` Clément Pit-Claudel
2020-05-22 13:56                                                       ` Pip Cet
     [not found]                                                         ` <83lflj16jn.fsf@gnu.org>
     [not found]                                                           ` <AF222EA0-FE05-4224-8459-2BF82CE27266@vasilij.de>
     [not found]                                                             ` <834ks7110w.fsf@gnu.org>
2020-05-23 11:24                                                               ` Vasilij Schneidermann
2020-05-23 13:04                                                                 ` Eli Zaretskii [this message]
     [not found]                                                           ` <83eerb145r.fsf@gnu.org>
     [not found]                                                             ` <CAOqdjBeef8Fa596raEyBUwv0Zr+41LSiYvHW39EdoaXpyxCXVw@mail.gmail.com>
     [not found]                                                               ` <831rnb0zld.fsf@gnu.org>
2020-05-23 12:36                                                                 ` Pip Cet
2020-05-23 14:08                                                                   ` Eli Zaretskii
2020-05-23 15:13                                                                     ` Pip Cet
2020-05-23 16:34                                                                       ` Eli Zaretskii
2020-05-23 22:38                                                                         ` Pip Cet
2020-05-24 15:33                                                                           ` Eli Zaretskii
2020-05-26 18:13                                                                             ` Pip Cet
2020-05-26 19:46                                                                               ` Eli Zaretskii
2020-05-27  9:36                                                                                 ` Pip Cet
2020-05-27 17:13                                                                                   ` Eli Zaretskii
2020-05-27 18:42                                                                                     ` Pip Cet
2020-05-27 19:19                                                                                       ` Eli Zaretskii
2020-05-23 17:32                                                                       ` Eli Zaretskii
2020-05-23 21:29                                                                         ` Pip Cet
2020-05-24 15:19                                                                           ` Eli Zaretskii
2020-05-23 12:47                                                                 ` Ligatures Stefan Monnier
2020-05-23 13:10                                                                   ` Ligatures Eli Zaretskii
2020-05-23 13:45                                                                     ` Ligatures Stefan Monnier
2020-05-23 14:12                                                                       ` Ligatures Eli Zaretskii
2020-05-23 13:36                                                                   ` Ligatures 조성빈
2020-05-23 14:15                                                                     ` Ligatures Stefan Monnier
2020-05-23 14:37                                                                   ` Ligatures Pip Cet
2020-05-22 11:44                                           ` Ligatures (was: Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY)) Eli Zaretskii
2020-05-22 13:26                                             ` Clément Pit-Claudel
2020-05-22 14:29                                               ` Eli Zaretskii
2020-05-22 14:32                                                 ` Clément Pit-Claudel
2020-05-22 19:00                                                   ` Eli Zaretskii
2020-05-21 21:06                                         ` Pip Cet
2020-05-22  6:06                                           ` Eli Zaretskii
2020-05-22  9:34                                             ` Pip Cet
2020-05-22 11:33                                               ` Eli Zaretskii
2020-05-19 20:26                           ` Alan Third
2020-05-19 10:09                   ` Trevor Spiteri
2020-05-19 14:22                     ` Eli Zaretskii
2020-05-19  5:43                 ` Ligatures ASSI
2020-05-19  7:22                   ` Ligatures tomas
2020-05-19  7:55                     ` Ligatures Joost Kremers
2020-05-19  8:07                       ` Ligatures tomas
2020-05-19 10:17                         ` Ligatures Yuri Khan
2020-05-19 14:26                           ` Ligatures Eli Zaretskii
2020-05-19 19:00                             ` Ligatures Yuri Khan
2020-05-19 10:43                         ` Ligatures Werner LEMBERG
2020-05-19 10:48                           ` Ligatures tomas
2020-05-19 14:18                   ` Ligatures Eli Zaretskii
2020-05-19 14:52                     ` Ligatures Eli Zaretskii
2020-05-19 15:11                       ` Ligatures Pip Cet
2020-05-19 15:36                         ` Ligatures Eli Zaretskii
2020-05-19 16:16                           ` Ligatures Pip Cet
2020-05-19 16:41                             ` Ligatures Eli Zaretskii
2020-05-19 17:00                             ` Ligatures Eli Zaretskii
2020-05-17 18:28       ` Unify the Platforms: Cairo+FreeType+Harfbuzz Everywhere (except TTY) Julius Pfrommer
2020-05-17 18:45         ` Eli Zaretskii
2020-05-17 22:28         ` chad
2020-05-18 22:08         ` Alan Third

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=83sgfqzts9.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=alan@idiocy.org \
    --cc=cpitclaudel@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=mail@vasilij.de \
    --cc=pipcet@gmail.com \
    /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.