1
0
Fork 0
mirror of https://github.com/alacritty/alacritty.git synced 2024-11-18 13:55:23 -05:00

Apply scaling to underline

Until now the underline position and thickness has been used without
applying any scaling. However they are both specified in font units
which do not change with the font size.

To make sure the underline looks correct with every size of the font,
the thickness and position are now scaled by the `x_scale` stored in the
font metrics.

This does not fix strikethrough yet, even though it looks significantly
better, the implementation is still a hack.

To make sure the underline doesn't disappear with small fonts, the
minimum underline thickness has been set to `1`. This decision was made
because the `Hack` font has an underline thickness under `0.5` with
relatively big fonts.
This edge-case can lead to some odd behavior when making the font size
super tiny (smaller than readable) so just not rendering any underline
might be a viable alternative.
This commit is contained in:
Christian Duerr 2018-02-16 00:40:00 +01:00
parent fd984f36b7
commit b818d6acdd
No known key found for this signature in database
GPG key ID: 85CDAE3C164BA7B4

View file

@ -93,10 +93,15 @@ impl ::Rasterize for FreeTypeRasterizer {
let height = (full.size_metrics.height / 64) as f64;
let descent = (full.size_metrics.descender / 64) as f32;
// Get underline position and thickness in device pixels
let x_scale = full.size_metrics.x_scale as f32 / 65536.0;
let underline_position =
(f32::from(face.ft_face.underline_position()) / 64.).round();
(f32::from(face.ft_face.underline_position()) * x_scale / 64.).round();
let underline_thickness =
(f32::from(face.ft_face.underline_thickness()) / 64.).round();
(f32::from(face.ft_face.underline_thickness()) * x_scale / 64.)
.round()
.max(1.);
Ok(Metrics {
average_advance: full.cell_width,