1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-11 03:27:05 +03:00

wezterm: fix scaling of color emoji

If you have a primary font whose height is a bit more than double the
width then a double-wide emoji would be scaled to a bit more than two
cells in width.

This commit adjust the glyph scaling to check both the x and y scaling
to ensure that they glyph fits within the appropriate number of cells.

This has the consequence of rendering eg: the heart emoji smaller than
in previous versions; the heart glyph is typically square but the
broadly used concept of width for the heart unicode character is a
single cell.  Previously we'd incorrectly render this double wide.
I'm not sure of a way to do better than we are right now because
freetype doesn't provide much help for scaling this kind of bitmap
font AFAICS.

refs: #320
This commit is contained in:
Wez Furlong 2020-11-14 12:37:23 -08:00
parent 25bbac4171
commit bc1e12e0f5

View File

@ -185,8 +185,19 @@ impl<T: Texture2d> GlyphCache<T> {
let (cell_width, cell_height) = (metrics.cell_width, metrics.cell_height);
let scale = if PixelLength::new(glyph.height as f64) > cell_height * 1.5 {
// This is another way to detect overside glyph images
cell_height.get() / glyph.height as f64
// This is another way to detect oversize glyph images.
// Compute an aspect-preserving scale factor that makes the glyph
// fit in the appropriate number of cells.
// The GlyphInfo tells us how many horizontal cells the glyph occupies.
let y_scale = cell_height.get() / glyph.height as f64;
let x_scale = (cell_width.get() * info.num_cells as f64) / glyph.width as f64;
if PixelLength::new(y_scale * glyph.width as f64) > cell_width {
// The y scale would overflow the width, so use the x-scale
x_scale
} else {
y_scale
}
} else {
1.0f64
};