Incorrect cache algorithm in _cairo_ft_unscaled_font_set_scale
Submitted by Joshua Granick
Assigned to David Turner
Description
The _cairo_ft_unscaled_font_set_scale
method has an incorrect method of detecting whether it needs to call FT_Set_Char_Size to resize a glyph.
Use font APIs with different matrix values multiple text API calls with different cairo_matrix_t values (but a constant font size) is one example that breaks. Glyphs will be rendered with mixed sizes as a result. This also can occur if other libraries referencing the shared FT_Face, such as using harfbuzz together with cairo.
Commenting the following code (lines 811-816 in cairo 1.15.2) temporarily resolves the problem:
if (unscaled->have_scale &&
scale->xx == unscaled->current_scale.xx &&
scale->yx == unscaled->current_scale.yx &&
scale->xy == unscaled->current_scale.xy &&
scale->yy == unscaled->current_scale.yy)
return CAIRO_STATUS_SUCCESS;
It would be ideal determine what is needed to fix this calculation. Thank you!