Linux: When calculating cell widths use the actual rendered bitmap width in addition to the horizontal advance reported by FreeType.

The horizontal advance is insufficient for some fonts at some point
sizes. So although rendering the characters is slower, we do it
to ensure cell width is correct. Fixes #352
This commit is contained in:
Kovid Goyal
2018-03-27 12:04:38 +05:30
parent 57f1bbb71a
commit 431564c8bc

View File

@@ -278,8 +278,12 @@ calc_cell_width(Face *self) {
unsigned int ans = 0;
for (char_type i = 32; i < 128; i++) {
int glyph_index = FT_Get_Char_Index(self->face, i);
if (load_glyph(self, glyph_index, FT_LOAD_DEFAULT)) {
ans = MAX(ans, (unsigned long)ceilf((float)self->face->glyph->metrics.horiAdvance / 64.f));
// We actually render the bitmap and get its width even though this is very slow, because
// there are fonts for which the horizontal advance is incorrect, see https://github.com/kovidgoyal/kitty/issues/352#issuecomment-376262576
if (load_glyph(self, glyph_index, FT_LOAD_RENDER)) {
unsigned int horizontal_advance = (unsigned int)ceilf((float)self->face->glyph->metrics.horiAdvance / 64.f);
ans = MAX(ans, self->face->glyph->bitmap.width);
ans = MAX(ans, horizontal_advance);
}
}
return ans;