1diff --git a/gfx/cairo/cairo/src/cairo-gstate.c b/gfx/cairo/cairo/src/cairo-gstate.c 2--- a/gfx/cairo/cairo/src/cairo-gstate.c 3+++ b/gfx/cairo/cairo/src/cairo-gstate.c 4@@ -1673,26 +1673,31 @@ _cairo_gstate_show_text_glyphs (cairo_gs 5 6 source_pattern = &source_pattern_stack.base; 7 status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern); 8 if (unlikely (status)) 9 goto CLEANUP_GLYPHS; 10 11 /* For really huge font sizes, we can just do path;fill instead of 12 * show_glyphs, as show_glyphs would put excess pressure on the cache, 13- * and moreover, not all components below us correctly handle huge font 14- * sizes. I wanted to set the limit at 256. But alas, seems like cairo's 15+ * not all components below us correctly handle huge font sizes, and 16+ * path filling can be cheaper since parts of glyphs are likely to be 17+ * clipped out. 256 seems like a good limit. But alas, seems like cairo's 18 * rasterizer is something like ten times slower than freetype's for huge 19- * sizes. So, no win just yet. For now, do it for insanely-huge sizes, 20- * just to make sure we don't make anyone unhappy. When we get a really 21- * fast rasterizer in cairo, we may want to readjust this. 22+ * sizes. So, no win just yet when we're using cairo's rasterizer. 23+ * For now, if we're using cairo's rasterizer, use path filling only 24+ * for insanely-huge sizes, just to make sure we don't make anyone 25+ * unhappy. When we get a really fast rasterizer in cairo, we may 26+ * want to readjust this. The threshold calculation is 27+ * encapsulated in _cairo_surface_get_text_path_fill_threshold. 28 * 29 * Needless to say, do this only if show_text_glyphs is not available. */ 30 if (cairo_surface_has_show_text_glyphs (gstate->target) || 31- _cairo_scaled_font_get_max_scale (gstate->scaled_font) <= 10240) { 32+ _cairo_scaled_font_get_max_scale (gstate->scaled_font) <= 33+ _cairo_surface_get_text_path_fill_threshold (gstate->target)) { 34 status = _cairo_surface_show_text_glyphs (gstate->target, 35 gstate->op, 36 source_pattern, 37 utf8, utf8_len, 38 transformed_glyphs, num_glyphs, 39 transformed_clusters, num_clusters, 40 cluster_flags, 41 gstate->scaled_font, NULL); 42diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c 43--- a/gfx/cairo/cairo/src/cairo-surface.c 44+++ b/gfx/cairo/cairo/src/cairo-surface.c 45@@ -1120,16 +1120,22 @@ cairo_surface_get_fallback_resolution (c 46 double *y_pixels_per_inch) 47 { 48 if (x_pixels_per_inch) 49 *x_pixels_per_inch = surface->x_fallback_resolution; 50 if (y_pixels_per_inch) 51 *y_pixels_per_inch = surface->y_fallback_resolution; 52 } 53 54+int 55+_cairo_surface_get_text_path_fill_threshold (const cairo_surface_t *surface) 56+{ 57+ return surface->backend->fill == NULL ? 10240 : 256; 58+} 59+ 60 cairo_bool_t 61 _cairo_surface_has_device_transform (cairo_surface_t *surface) 62 { 63 return ! _cairo_matrix_is_identity (&surface->device_transform); 64 } 65 66 /** 67 * _cairo_surface_acquire_source_image: 68diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h 69--- a/gfx/cairo/cairo/src/cairoint.h 70+++ b/gfx/cairo/cairo/src/cairoint.h 71@@ -2065,16 +2065,19 @@ _cairo_surface_composite_shape_fixup_unb 72 int dst_x, 73 int dst_y, 74 unsigned int width, 75 unsigned int height); 76 77 cairo_private cairo_bool_t 78 _cairo_surface_is_opaque (const cairo_surface_t *surface); 79 80+cairo_private int 81+_cairo_surface_get_text_path_fill_threshold (const cairo_surface_t *surface); 82+ 83 cairo_private void 84 _cairo_surface_set_device_scale (cairo_surface_t *surface, 85 double sx, 86 double sy); 87 88 cairo_private cairo_bool_t 89 _cairo_surface_has_device_transform (cairo_surface_t *surface); 90 91