|
1 diff --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); |
|
42 diff --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: |
|
68 diff --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 |