diff options
Diffstat (limited to 'src/cairo-surface-wrapper.c')
-rw-r--r-- | src/cairo-surface-wrapper.c | 163 |
1 files changed, 73 insertions, 90 deletions
diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c index 8ba82bd40..29c19c5a5 100644 --- a/src/cairo-surface-wrapper.c +++ b/src/cairo-surface-wrapper.c @@ -1,3 +1,4 @@ +/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc @@ -47,12 +48,18 @@ static void _copy_transformed_pattern (cairo_pattern_t *pattern, const cairo_pattern_t *original, - const cairo_matrix_t *ctm_inverse) + const cairo_matrix_t *ctm_inverse, + unsigned int region_id) { _cairo_pattern_init_static_copy (pattern, original); if (! _cairo_matrix_is_identity (ctm_inverse)) _cairo_pattern_transform (pattern, ctm_inverse); + + if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { + cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; + surface_pattern->region_array_id = region_id; + } } cairo_status_t @@ -129,9 +136,10 @@ _cairo_surface_wrapper_get_clip (cairo_surface_wrapper_t *wrapper, cairo_status_t _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_clip_t *clip) + cairo_operator_t op, + const cairo_pattern_t *source, + unsigned int source_region_id, + const cairo_clip_t *clip) { cairo_status_t status; cairo_clip_t *dev_clip; @@ -144,10 +152,7 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, if (_cairo_clip_is_all_clipped (dev_clip)) return CAIRO_INT_STATUS_NOTHING_TO_DO; - if (source->is_userfont_foreground && wrapper->foreground_source) - source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || source_region_id != 0) { cairo_matrix_t m; _cairo_surface_wrapper_get_transform (wrapper, &m); @@ -155,7 +160,7 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, status = cairo_matrix_invert (&m); assert (status == CAIRO_STATUS_SUCCESS); - _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&source_copy.base, source, &m, source_region_id); source = &source_copy.base; } @@ -165,13 +170,14 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, return status; } - cairo_status_t _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_pattern_t *mask, - const cairo_clip_t *clip) + cairo_operator_t op, + const cairo_pattern_t *source, + unsigned int source_region_id, + const cairo_pattern_t *mask, + unsigned int mask_region_id, + const cairo_clip_t *clip) { cairo_status_t status; cairo_clip_t *dev_clip; @@ -185,10 +191,7 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, if (_cairo_clip_is_all_clipped (dev_clip)) return CAIRO_INT_STATUS_NOTHING_TO_DO; - if (source->is_userfont_foreground && wrapper->foreground_source) - source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || source_region_id != 0 || mask_region_id != 0) { cairo_matrix_t m; _cairo_surface_wrapper_get_transform (wrapper, &m); @@ -196,10 +199,10 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, status = cairo_matrix_invert (&m); assert (status == CAIRO_STATUS_SUCCESS); - _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&source_copy.base, source, &m, source_region_id); source = &source_copy.base; - _copy_transformed_pattern (&mask_copy.base, mask, &m); + _copy_transformed_pattern (&mask_copy.base, mask, &m, mask_region_id); mask = &mask_copy.base; } @@ -210,16 +213,17 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, } cairo_status_t -_cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t *path, - const cairo_stroke_style_t *stroke_style, - const cairo_matrix_t *ctm, - const cairo_matrix_t *ctm_inverse, - double tolerance, - cairo_antialias_t antialias, - const cairo_clip_t *clip) +_cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + unsigned int source_region_id, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) { cairo_status_t status; cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; @@ -235,10 +239,7 @@ _cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, if (_cairo_clip_is_all_clipped (dev_clip)) return CAIRO_INT_STATUS_NOTHING_TO_DO; - if (source->is_userfont_foreground && wrapper->foreground_source) - source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || source_region_id != 0) { cairo_matrix_t m; _cairo_surface_wrapper_get_transform (wrapper, &m); @@ -257,7 +258,7 @@ _cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse); - _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&source_copy.base, source, &m, source_region_id); source = &source_copy.base; } @@ -275,21 +276,23 @@ _cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, } cairo_status_t -_cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, - cairo_operator_t fill_op, - const cairo_pattern_t *fill_source, - cairo_fill_rule_t fill_rule, - double fill_tolerance, - cairo_antialias_t fill_antialias, - const cairo_path_fixed_t*path, - cairo_operator_t stroke_op, - const cairo_pattern_t *stroke_source, - const cairo_stroke_style_t *stroke_style, - const cairo_matrix_t *stroke_ctm, - const cairo_matrix_t *stroke_ctm_inverse, - double stroke_tolerance, - cairo_antialias_t stroke_antialias, - const cairo_clip_t *clip) +_cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, + cairo_operator_t fill_op, + const cairo_pattern_t *fill_source, + unsigned int fill_region_id, + cairo_fill_rule_t fill_rule, + double fill_tolerance, + cairo_antialias_t fill_antialias, + const cairo_path_fixed_t *path, + cairo_operator_t stroke_op, + const cairo_pattern_t *stroke_source, + unsigned int stroke_region_id, + const cairo_stroke_style_t *stroke_style, + const cairo_matrix_t *stroke_ctm, + const cairo_matrix_t *stroke_ctm_inverse, + double stroke_tolerance, + cairo_antialias_t stroke_antialias, + const cairo_clip_t *clip) { cairo_status_t status; cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *)path; @@ -306,13 +309,7 @@ _cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, if (_cairo_clip_is_all_clipped (dev_clip)) return CAIRO_INT_STATUS_NOTHING_TO_DO; - if (fill_source->is_userfont_foreground && wrapper->foreground_source) - fill_source = wrapper->foreground_source; - - if (stroke_source->is_userfont_foreground && wrapper->foreground_source) - stroke_source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || fill_region_id != 0 || stroke_region_id != 0) { cairo_matrix_t m; _cairo_surface_wrapper_get_transform (wrapper, &m); @@ -331,10 +328,10 @@ _cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, cairo_matrix_multiply (&dev_ctm_inverse, &m, &dev_ctm_inverse); - _copy_transformed_pattern (&stroke_source_copy.base, stroke_source, &m); + _copy_transformed_pattern (&stroke_source_copy.base, stroke_source, &m, fill_region_id); stroke_source = &stroke_source_copy.base; - _copy_transformed_pattern (&fill_source_copy.base, fill_source, &m); + _copy_transformed_pattern (&fill_source_copy.base, fill_source, &m, stroke_region_id); fill_source = &fill_source_copy.base; } @@ -356,14 +353,15 @@ _cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, } cairo_status_t -_cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, - const cairo_clip_t *clip) +_cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, + cairo_operator_t op, + const cairo_pattern_t *source, + unsigned int source_region_id, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias, + const cairo_clip_t *clip) { cairo_status_t status; cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; @@ -377,10 +375,7 @@ _cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, if (_cairo_clip_is_all_clipped (dev_clip)) return CAIRO_INT_STATUS_NOTHING_TO_DO; - if (source->is_userfont_foreground && wrapper->foreground_source) - source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || source_region_id != 0) { cairo_matrix_t m; _cairo_surface_wrapper_get_transform (wrapper, &m); @@ -395,7 +390,7 @@ _cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, status = cairo_matrix_invert (&m); assert (status == CAIRO_STATUS_SUCCESS); - _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&source_copy.base, source, &m, source_region_id); source = &source_copy.base; } @@ -412,9 +407,10 @@ _cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, } cairo_status_t -_cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, +_cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, cairo_operator_t op, const cairo_pattern_t *source, + unsigned int source_region_id, const char *utf8, int utf8_len, const cairo_glyph_t *glyphs, @@ -443,10 +439,7 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, cairo_surface_get_font_options (wrapper->target, &options); cairo_font_options_merge (&options, &scaled_font->options); - if (source->is_userfont_foreground && wrapper->foreground_source) - source = wrapper->foreground_source; - - if (wrapper->needs_transform) { + if (wrapper->needs_transform || source_region_id != 0) { cairo_matrix_t m; int i; @@ -481,7 +474,7 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, status = cairo_matrix_invert (&m); assert (status == CAIRO_STATUS_SUCCESS); - _copy_transformed_pattern (&source_copy.base, source, &m); + _copy_transformed_pattern (&source_copy.base, source, &m, source_region_id); source = &source_copy.base; } else { if (! cairo_font_options_equal (&options, &scaled_font->options)) { @@ -613,14 +606,6 @@ _cairo_surface_wrapper_set_clip (cairo_surface_wrapper_t *wrapper, } void -_cairo_surface_wrapper_set_foreground_color (cairo_surface_wrapper_t *wrapper, - const cairo_color_t *color) -{ - if (color) - wrapper->foreground_source = _cairo_pattern_create_solid (color); -} - -void _cairo_surface_wrapper_get_font_options (cairo_surface_wrapper_t *wrapper, cairo_font_options_t *options) { @@ -651,7 +636,8 @@ _cairo_surface_wrapper_init (cairo_surface_wrapper_t *wrapper, wrapper->has_extents = FALSE; wrapper->extents.x = wrapper->extents.y = 0; wrapper->clip = NULL; - wrapper->foreground_source = NULL; + wrapper->source_region_id = 0; + wrapper->mask_region_id = 0; wrapper->needs_transform = FALSE; if (target) { @@ -663,9 +649,6 @@ _cairo_surface_wrapper_init (cairo_surface_wrapper_t *wrapper, void _cairo_surface_wrapper_fini (cairo_surface_wrapper_t *wrapper) { - if (wrapper->foreground_source) - cairo_pattern_destroy (wrapper->foreground_source); - cairo_surface_destroy (wrapper->target); } |