[PATCH] Fix emoji font support
mawww at kakoune.org
mawww at kakoune.org
Mon Feb 10 23:46:05 CET 2020
On 2020-02-11 04:37, Marc Lehmann wrote:
> The reason why we go directly for freetype metrics as because xft often
> gives
> wrong metrics, which is disastrous for rxvt-unicode, which absolutely
> needs
> to know if characters overlap and how tall they really are, for
> example.
>
> That means that simply using xft metrics is not an option, as these are
> often
> simply wrong for normal fonts, and normal font rendering cetrainly has
> priority over emoji bitmap fonts.
Looking at the code, if there is no transforms applied, it looks like
the only
difference between rxvt-unicode and libXft computation is the rounding,
which I
agree can be an issue.
>> > So it only affects bitmap fonts? Any specific font that exhibits these
>> > issues?
>>
>> The intention is to enable Noto Color Emoji.
>
> Well, why doesn't it already work, for example? I still have no idea
> whatt
> he problem is that the patch tries to fix. Does urxvt cut off
> characters,
> or what happens?
If we use the emoji font first in the font list, then urxvt computes the
metrics
pre-scaling, so ends up with a 124x124 font metric when the rendered
glyphs are
actually say 12x12. This leads to huge spacing between lines.
Without the emoji inside the extent_test_chars, the emoji font is
ignored because
we cannot compute its width (as none of the characters we try exists in
the font).
>> In any case, the rest of the patch (everything but the hunk at line
>> 1239)
>> is IMHO improving the correctness of rxvt-unicode by making it use
>> text_t
>> for width computation, respecting the UNICODE_3 setting. I think this
>> could
>> be applied independently.
>
> It does increase code size and I don't see what would be incorrect with
> the old code - could you elaborate what you perceive as incorrect in
> the
> existing code?
AFAIK the only increase in code size is in static storage for
extent_test_chars,
which takes 21 * 4 = 84 bytes instead of 20 * 2 = 40 bytes. It is not
something
I would worry about (especially as this only takes place *if*
rxvt-unicode is
compiled with UNICODE_3 support).
I believe it is more "correct" because it removes a potential source of
error
by making extent_test_chars match the codepoint type that rxvt-unicode
uses,
instead of having a special case that extent_test_chars only support
16bit
codepoints even when rxvt-unicode is compiled with support for 32bit
codepoints.
Also, the addition of the `#if UNICODE_3` line makes it pretty clear for
future
modifications that where to put eventual additional 32bit codepoints.
Cheers,
Maxime.
More information about the rxvt-unicode
mailing list