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
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

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;