Bug 450017 - Emoji without Emoji_Presentation are rendered as wide if Noto Color Emoji is used
Summary: Emoji without Emoji_Presentation are rendered as wide if Noto Color Emoji is ...
Status: RESOLVED FIXED
Alias: None
Product: konsole
Classification: Applications
Component: font (show other bugs)
Version: 21.12.2
Platform: Arch Linux Linux
: NOR normal
Target Milestone: ---
Assignee: Konsole Developer
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-02-11 15:43 UTC by Fabian Homborg
Modified: 2024-03-23 03:51 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments
A screenshot showing the aforementioned command and its output (with Hack+Noto) (12.28 KB, image/png)
2022-02-11 15:43 UTC, Fabian Homborg
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Fabian Homborg 2022-02-11 15:43:45 UTC
Created attachment 146583 [details]
A screenshot showing the aforementioned command and its output (with Hack+Noto)

SUMMARY
***
NOTE: If you are reporting a crash, please try to attach a backtrace with debug symbols.
See https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports
***


STEPS TO REPRODUCE
1. Use Noto Color Emoji font
2.  Run `python3 -c 'print ("aabanana\n\U0001F336banana")'`

OBSERVED RESULT
The second "banana" starts somewhere around the third column

EXPECTED RESULT
The second banana starts one column *before* the first, after the first "a"

SOFTWARE/OS VERSIONS
Linux/KDE Plasma: Kernel 5.16.8-arch1-1
(available in About System)
KDE Plasma Version: 5.24.0
KDE Frameworks Version: 5.90.0
Qt Version: 5.15.2

ADDITIONAL INFORMATION

Unicode UAX#11 "East Asian Width" since Version 9 has some exceptions for Emoji to render as wide regardless of their given "East Asian Width", but this only applies to

1. "emoji presentation sequences" (i.e. the emoji and variation selector 16, the emoji presentation selector)
2. Codepoints with the "Emoji_Presentation" property

This doesn't apply to e.g. U+1F336, as in this example. Its East Asian Width should be used, and it is classified as 

I work on https://github.com/ridiculousfish/widecharwidth and https://github.com/fish-shell/fish-shell, and this makes it disagree with both, which means cursor movement will be out-of-sync, leading to awkward glitches.

I typically use Hack with an override to select Noto Color Emoji for emoji (because I don't like Hack's emoji), but this is reproducible just with the latter. The font selection should not change the width, because that means the application can't rely on it and it has no way to query the font.

If it isn't possible to get Noto to render it as narrow, it should not be selectable as a font because it can only lead to breakage.
Comment 1 Bug Janitor Service 2022-08-06 18:51:54 UTC
A possibly relevant merge request was started @ https://invent.kde.org/utilities/konsole/-/merge_requests/722
Comment 2 Kurt Hindenburg 2022-08-27 01:11:28 UTC
Git commit 76f879cd70fb494ab2334d2660b34679546f3d9d by Kurt Hindenburg, on behalf of Matan Ziv-Av.
Committed on 26/08/2022 at 19:24.
Pushed by hindenburg into branch 'master'.

Draw characters in exact positions

QT can't be made to draw monospaced text (if the font does not cooperate),
so avoid combining characters, using a QPainter::drawText() call for each
character.

For bidi text support this change requires konsole to reorder and reshape
the characters. This is done using the ICU library (which QT also uses).

This change allows for some improvements related to text rendering:

- More precise bidi reordering, which is no longer changed by characters'
  attributes and selection.
- underlines drawn separately from the text, allowing for differing
  underline modes (double, curly, dashed, dotted, colored).
- Overriding font for emoji characters.

This commit fixes a few bugs and addresses a lot more:

Feature requests: More standard conforming RTL and various underlines:
Related: bug 403729, bug 387811, bug 416508, bug 452087, bug 425973, bug 430822, bug 442742, bug 441037, bug 430822, bug 440070, bug 445846, bug 453086, bug 381593, bug 451716

Using non-monospace font:



Emoji:

Regression: devanagari rendering

M  +2    -0    CMakeLists.txt
M  +1    -0    src/CMakeLists.txt
M  +47   -25   src/FontDialog.cpp
M  +2    -1    src/FontDialog.h
M  +127  -23   src/Screen.cpp
M  +18   -5    src/Screen.h
M  +28   -13   src/Vt102Emulation.cpp
M  +0    -29   src/autotests/CharacterTest.cpp
M  +0    -1    src/autotests/CharacterTest.h
M  +1    -1    src/autotests/TerminalCharacterDecoderTest.cpp
M  +119  -29   src/characters/Character.h
M  +1    -1    src/characters/Hangul.cpp
M  +5    -4    src/decoders/HTMLDecoder.cpp
M  +1    -1    src/decoders/PlainTextDecoder.cpp
M  +3    -0    src/profile/Profile.cpp
M  +29   -0    src/profile/Profile.h
M  +101  -6    src/terminalDisplay/TerminalDisplay.cpp
M  +7    -0    src/terminalDisplay/TerminalDisplay.h
M  +42   -0    src/terminalDisplay/TerminalFonts.cpp
M  +12   -0    src/terminalDisplay/TerminalFonts.h
M  +542  -269  src/terminalDisplay/TerminalPainter.cpp
M  +40   -13   src/terminalDisplay/TerminalPainter.h
M  +2    -0    src/widgets/EditProfileAdvancedPage.ui
M  +113  -3    src/widgets/EditProfileAppearancePage.ui
M  +61   -3    src/widgets/EditProfileDialog.cpp
M  +6    -1    src/widgets/EditProfileDialog.h

https://invent.kde.org/utilities/konsole/commit/76f879cd70fb494ab2334d2660b34679546f3d9d
Comment 3 Kurt Hindenburg 2024-03-23 03:51:29 UTC
let us know if this still an issue