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