summaryrefslogtreecommitdiff
path: root/src/ftcrfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ftcrfont.c')
-rw-r--r--src/ftcrfont.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index ddd3cc9be64..db417b3e77d 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -84,7 +84,12 @@ ftcrfont_glyph_extents (struct font *font,
cache->lbearing = floor (extents.x_bearing);
cache->rbearing = ceil (extents.width + extents.x_bearing);
cache->width = lround (extents.x_advance);
- cache->ascent = ceil (- extents.y_bearing);
+ /* The subtraction of a small number is to avoid rounding up due
+ to floating-point inaccuracies with some fonts, which then
+ could cause unpleasant effects while scrolling (see bug
+ #44284), since we then think that a glyph row's ascent is too
+ small to accommodate a glyph with a higher phys_ascent. */
+ cache->ascent = ceil (- extents.y_bearing - 1.0 / 256);
cache->descent = ceil (extents.height + extents.y_bearing);
}
@@ -200,7 +205,8 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
block_input ();
cairo_glyph_t stack_glyph;
- font->min_width = font->average_width = font->space_width = 0;
+ font->min_width = font->max_width = 0;
+ font->average_width = font->space_width = 0;
for (char c = 32; c < 127; c++)
{
cairo_glyph_t *glyphs = &stack_glyph;
@@ -224,6 +230,8 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
&& (! font->min_width
|| font->min_width > this_width))
font->min_width = this_width;
+ if (this_width > font->max_width)
+ font->max_width = this_width;
if (c == 32)
font->space_width = this_width;
font->average_width += this_width;
@@ -278,6 +286,7 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
font->relative_compose = 0;
font->default_ascent = 0;
font->vertical_centering = false;
+ eassert (font->max_width < 512 * 1024 * 1024);
return font_object;
}
@@ -340,14 +349,13 @@ ftcrfont_encode_char (struct font *font, int c)
struct font_info *ftcrfont_info = (struct font_info *) font;
unsigned code = FONT_INVALID_CODE;
unsigned char utf8[MAX_MULTIBYTE_LENGTH];
- unsigned char *p = utf8;
+ int utf8len = CHAR_STRING (c, utf8);
cairo_glyph_t stack_glyph;
cairo_glyph_t *glyphs = &stack_glyph;
int num_glyphs = 1;
- CHAR_STRING_ADVANCE (c, p);
if (cairo_scaled_font_text_to_glyphs (ftcrfont_info->cr_scaled_font, 0, 0,
- (char *) utf8, p - utf8,
+ (char *) utf8, utf8len,
&glyphs, &num_glyphs,
NULL, NULL, NULL)
== CAIRO_STATUS_SUCCESS)