summaryrefslogtreecommitdiff
path: root/font
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2017-12-06 22:24:47 +0100
committerJoe Wilm <jwilm@users.noreply.github.com>2017-12-24 09:46:54 -0800
commitbf72b5a326c2c06541fd0564417a4ad52a9938bc (patch)
tree269ef6325214f9a45c666537abcee97417e2780d /font
parent958a32767ff9e06dc569eb612da889bfa06970be (diff)
downloadalacritty-bf72b5a326c2c06541fd0564417a4ad52a9938bc.tar.gz
alacritty-bf72b5a326c2c06541fd0564417a4ad52a9938bc.zip
Add custom underline cursor
As mentioned in jwilm/alacritty#931, it can be troublesome if a font has an underline symbol outside of the glyph's bounding box. This can lead to the underline disappearing at the bottom of the terminal. As a solution a symbol from the private use area was used as the character code for the underline symbol. Whenever this symbol is encountered, instead of rendering it, a custom block is rendered. In this implementation the block has the full character as width and sits flush with the bottom of the glyph's bounding box. The height is half the distance between the baseline and the bottom of the bounding box.
Diffstat (limited to 'font')
-rw-r--r--font/src/ft/mod.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/font/src/ft/mod.rs b/font/src/ft/mod.rs
index 6cd859e9..25917e96 100644
--- a/font/src/ft/mod.rs
+++ b/font/src/ft/mod.rs
@@ -294,6 +294,29 @@ impl FreeTypeRasterizer {
let (pixel_width, buf) = Self::normalize_buffer(&glyph.bitmap())?;
+ // Render a custom symbol for the underline cursor
+ if glyph_key.c == '􊏢' {
+ // Get the bottom of the bounding box
+ let size_metrics = face.ft_face.size_metrics()
+ .ok_or(Error::MissingSizeMetrics)?;
+ let descent = (size_metrics.descender / 64) as f32;
+
+ // Create a new rectangle, the height is half the distance between
+ // bounding box bottom and the baseline
+ let height = f32::abs(descent / 2.) as i32;
+ let buf = vec![255u8; (pixel_width * height * 3) as usize];
+
+ // Create a custom glyph with the rectangle data attached to it
+ return Ok(RasterizedGlyph {
+ c: glyph_key.c,
+ top: descent as i32 + height,
+ left: glyph.bitmap_left(),
+ height,
+ width: pixel_width,
+ buf: buf,
+ });
+ }
+
Ok(RasterizedGlyph {
c: glyph_key.c,
top: glyph.bitmap_top(),