diff --git a/src/cairo-analysis-surface.c b/src/cairo-analysis-surface.c index afbd30fb4..e49af6694 100644 --- a/src/cairo-analysis-surface.c +++ b/src/cairo-analysis-surface.c @@ -393,7 +393,7 @@ static cairo_int_status_t _cairo_analysis_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-directfb-surface.c b/src/cairo-directfb-surface.c index 409f79d9b..198c1989d 100644 --- a/src/cairo-directfb-surface.c +++ b/src/cairo-directfb-surface.c @@ -1451,7 +1451,7 @@ static cairo_int_status_t _cairo_directfb_surface_show_glyphs ( void *abstract_dst, cairo_operator_t op, cairo_pattern_t *pattern, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index 8f497a9cc..c61ec4d25 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -2086,7 +2086,7 @@ _cairo_glitz_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, int dst_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs) { cairo_glitz_surface_attributes_t attributes; diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index cda40b1dc..e0d306562 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -58,6 +58,9 @@ _cairo_gstate_transform_glyphs_to_backend (cairo_gstate_t *gstate, int num_glyphs, cairo_glyph_t *transformed_glyphs); +static cairo_bool_t +_cairo_gstate_transform_glyphs_to_backend_required (cairo_gstate_t *gstate); + cairo_status_t _cairo_gstate_init (cairo_gstate_t *gstate, cairo_surface_t *target) @@ -1567,16 +1570,19 @@ _cairo_gstate_show_glyphs (cairo_gstate_t *gstate, if (status) return status; - if (num_glyphs <= STACK_GLYPHS_LEN) { - transformed_glyphs = stack_transformed_glyphs; - } else { - transformed_glyphs = _cairo_malloc_ab (num_glyphs, sizeof(cairo_glyph_t)); - if (transformed_glyphs == NULL) - return CAIRO_STATUS_NO_MEMORY; - } + if (_cairo_gstate_transform_glyphs_to_backend_required (gstate)) { + if (num_glyphs <= STACK_GLYPHS_LEN) { + transformed_glyphs = stack_transformed_glyphs; + } else { + transformed_glyphs = _cairo_malloc_ab (num_glyphs, sizeof(cairo_glyph_t)); + if (transformed_glyphs == NULL) + return CAIRO_STATUS_NO_MEMORY; + } - _cairo_gstate_transform_glyphs_to_backend (gstate, glyphs, num_glyphs, - transformed_glyphs); + _cairo_gstate_transform_glyphs_to_backend (gstate, glyphs, num_glyphs, + transformed_glyphs); + } else + transformed_glyphs = (cairo_glyph_t *) glyphs; status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); if (status) @@ -1592,7 +1598,8 @@ _cairo_gstate_show_glyphs (cairo_gstate_t *gstate, _cairo_pattern_fini (&source_pattern.base); CLEANUP_GLYPHS: - if (transformed_glyphs != stack_transformed_glyphs) + if (transformed_glyphs != stack_transformed_glyphs && + transformed_glyphs != glyphs) free (transformed_glyphs); return status; @@ -1648,6 +1655,20 @@ _cairo_gstate_get_antialias (cairo_gstate_t *gstate) return gstate->antialias; } +static cairo_bool_t +_cairo_gstate_transform_glyphs_to_backend_required (cairo_gstate_t *gstate) +{ + cairo_matrix_t *ctm = &gstate->ctm; + cairo_matrix_t *device_transform = &gstate->target->device_transform; + + if (_cairo_matrix_is_identity (ctm) && + _cairo_matrix_is_identity (device_transform) && + gstate->font_matrix.x0 == 0 && gstate->font_matrix.y0 == 0) + return FALSE; + + return TRUE; +} + /** * _cairo_gstate_transform_glyphs_to_backend: * @gstate: a #cairo_gstate_t diff --git a/src/cairo-meta-surface.c b/src/cairo-meta-surface.c index d8f5064a7..bc5434c55 100644 --- a/src/cairo-meta-surface.c +++ b/src/cairo-meta-surface.c @@ -426,7 +426,7 @@ static cairo_int_status_t _cairo_meta_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index 85f00fa34..e8bdc2a34 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -530,7 +530,7 @@ static cairo_int_status_t _cairo_paginated_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 267760507..aa65dad2f 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -3880,7 +3880,7 @@ static cairo_int_status_t _cairo_pdf_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index 211ecd14c..53e55dc40 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -2230,7 +2230,7 @@ static cairo_int_status_t _cairo_ps_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c index 540bdca76..d87d31e59 100644 --- a/src/cairo-quartz-surface.c +++ b/src/cairo-quartz-surface.c @@ -1315,7 +1315,7 @@ static cairo_int_status_t _cairo_quartz_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c index cb3af9f0d..387a1b9d0 100644 --- a/src/cairo-scaled-font.c +++ b/src/cairo-scaled-font.c @@ -1140,7 +1140,7 @@ _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; diff --git a/src/cairo-surface-fallback-private.h b/src/cairo-surface-fallback-private.h index 82c56256b..00ad49ebb 100644 --- a/src/cairo-surface-fallback-private.h +++ b/src/cairo-surface-fallback-private.h @@ -75,7 +75,7 @@ cairo_private cairo_status_t _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); diff --git a/src/cairo-surface-fallback.c b/src/cairo-surface-fallback.c index ab19d2c22..ced4dc569 100644 --- a/src/cairo-surface-fallback.c +++ b/src/cairo-surface-fallback.c @@ -915,7 +915,7 @@ _cairo_surface_fallback_fill (cairo_surface_t *surface, typedef struct { cairo_scaled_font_t *font; - cairo_glyph_t *glyphs; + const cairo_glyph_t *glyphs; int num_glyphs; } cairo_show_glyphs_info_t; @@ -984,7 +984,7 @@ cairo_status_t _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-surface.c b/src/cairo-surface.c index b44b853ff..8e39b5e9e 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -1901,7 +1901,7 @@ cairo_status_t _cairo_surface_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { @@ -1986,7 +1986,7 @@ _cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index eafec32da..60fea966b 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -1954,7 +1954,7 @@ static cairo_int_status_t _cairo_svg_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *pattern, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-win32-font.c b/src/cairo-win32-font.c index 484ca17be..d9e82c0b0 100644 --- a/src/cairo-win32-font.c +++ b/src/cairo-win32-font.c @@ -1170,7 +1170,7 @@ _cairo_win32_scaled_font_show_glyphs (void *abstract_font, int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs) { cairo_win32_scaled_font_t *scaled_font = abstract_font; diff --git a/src/cairo-win32-surface.c b/src/cairo-win32-surface.c index 1358670da..e82a52828 100644 --- a/src/cairo-win32-surface.c +++ b/src/cairo-win32-surface.c @@ -1497,7 +1497,7 @@ static cairo_int_status_t _cairo_win32_surface_show_glyphs (void *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c index bcdadae46..46ee162e4 100644 --- a/src/cairo-xcb-surface.c +++ b/src/cairo-xcb-surface.c @@ -1620,11 +1620,11 @@ _cairo_xcb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, static cairo_int_status_t _cairo_xcb_surface_show_glyphs (void *abstract_dst, - cairo_operator_t op, - cairo_pattern_t *src_pattern, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font); + cairo_operator_t op, + cairo_pattern_t *src_pattern, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font); static cairo_bool_t _cairo_xcb_surface_is_similar (void *surface_a, @@ -2307,11 +2307,11 @@ typedef cairo_status_t (*cairo_xcb_surface_show_glyphs_func_t) static cairo_int_status_t _cairo_xcb_surface_show_glyphs (void *abstract_dst, - cairo_operator_t op, - cairo_pattern_t *src_pattern, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_scaled_font_t *scaled_font) + cairo_operator_t op, + cairo_pattern_t *src_pattern, + const cairo_glyph_t *glyphs, + int num_glyphs, + cairo_scaled_font_t *scaled_font) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; cairo_xcb_surface_t *dst = abstract_dst; diff --git a/src/cairo-xlib-surface.c b/src/cairo-xlib-surface.c index c95ec16ce..6021622f9 100644 --- a/src/cairo-xlib-surface.c +++ b/src/cairo-xlib-surface.c @@ -68,7 +68,7 @@ static cairo_int_status_t _cairo_xlib_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); @@ -2984,7 +2984,7 @@ static cairo_int_status_t _cairo_xlib_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/cairoint.h b/src/cairoint.h index 58f2ea352..dcdcb9a6a 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -570,7 +570,7 @@ struct _cairo_scaled_font_backend { int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs); cairo_warn cairo_int_status_t @@ -798,7 +798,7 @@ struct _cairo_surface_backend { int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs); void @@ -860,7 +860,7 @@ struct _cairo_surface_backend { (*show_glyphs) (void *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); @@ -1638,7 +1638,7 @@ _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs); cairo_private cairo_status_t @@ -1810,7 +1810,7 @@ cairo_private cairo_status_t _cairo_surface_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); @@ -1917,7 +1917,7 @@ _cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, int dest_y, unsigned int width, unsigned int height, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs); cairo_private cairo_status_t diff --git a/src/test-meta-surface.c b/src/test-meta-surface.c index 3992b4c69..41eb7c47c 100644 --- a/src/test-meta-surface.c +++ b/src/test-meta-surface.c @@ -251,7 +251,7 @@ static cairo_int_status_t _test_meta_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { diff --git a/src/test-paginated-surface.c b/src/test-paginated-surface.c index 1e08c2d86..9f8040fa0 100644 --- a/src/test-paginated-surface.c +++ b/src/test-paginated-surface.c @@ -228,7 +228,7 @@ static cairo_int_status_t _test_paginated_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, - cairo_glyph_t *glyphs, + const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) {