[pattern] Avoid needless copying of patterns.

Only copy the pattern if we need to modify it, e.g. preserve a copy in a
snapshot or a soft-mask, or to modify the matrix. Otherwise we can
continue to use the original pattern and mark it as const in order to
generate compiler warnings if we do attempt to write to it.
This commit is contained in:
Chris Wilson 2008-10-22 19:24:44 +01:00
parent 9d2189afbd
commit 7944601864
27 changed files with 607 additions and 529 deletions

View file

@ -96,10 +96,10 @@ _cairo_analysis_surface_merge_status (cairo_int_status_t status_a,
static cairo_int_status_t
_analyze_meta_surface_pattern (cairo_analysis_surface_t *surface,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
cairo_surface_t *analysis = &surface->base;
cairo_surface_pattern_t *surface_pattern;
const cairo_surface_pattern_t *surface_pattern;
cairo_status_t status;
cairo_bool_t old_has_ctm;
cairo_matrix_t old_ctm, p2d;
@ -109,7 +109,7 @@ _analyze_meta_surface_pattern (cairo_analysis_surface_t *surface,
int old_height;
assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE);
surface_pattern = (cairo_surface_pattern_t *) pattern;
surface_pattern = (const cairo_surface_pattern_t *) pattern;
assert (_cairo_surface_is_meta (surface_pattern->surface));
old_width = surface->width;
@ -321,8 +321,8 @@ _cairo_analysis_surface_get_extents (void *abstract_surface,
static cairo_int_status_t
_cairo_analysis_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
cairo_operator_t op,
const cairo_pattern_t *source)
{
cairo_analysis_surface_t *surface = abstract_surface;
cairo_status_t status, backend_status;
@ -362,8 +362,8 @@ _cairo_analysis_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_analysis_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_analysis_surface_t *surface = abstract_surface;
cairo_int_status_t status, backend_status;
@ -381,7 +381,7 @@ _cairo_analysis_surface_mask (void *abstract_surface,
cairo_int_status_t backend_mask_status = CAIRO_STATUS_SUCCESS;
if (source->type == CAIRO_PATTERN_TYPE_SURFACE) {
cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) source;
const cairo_surface_pattern_t *surface_pattern = (const cairo_surface_pattern_t *) source;
if (_cairo_surface_is_meta (surface_pattern->surface)) {
backend_source_status =
_analyze_meta_surface_pattern (surface, source);
@ -411,6 +411,7 @@ _cairo_analysis_surface_mask (void *abstract_surface,
if (_cairo_operator_bounded_by_source (op)) {
cairo_rectangle_int_t source_extents;
status = _cairo_pattern_get_extents (source, &source_extents);
if (status)
return status;
@ -438,7 +439,7 @@ _cairo_analysis_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_analysis_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -510,7 +511,7 @@ _cairo_analysis_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_analysis_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -578,7 +579,7 @@ _cairo_analysis_surface_fill (void *abstract_surface,
static cairo_int_status_t
_cairo_analysis_surface_show_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
@ -653,7 +654,7 @@ _cairo_analysis_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_cairo_analysis_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,
@ -897,18 +898,18 @@ typedef cairo_int_status_t
typedef cairo_int_status_t
(*_paint_func) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source);
const cairo_pattern_t *source);
typedef cairo_int_status_t
(*_mask_func) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask);
const cairo_pattern_t *source,
const cairo_pattern_t *mask);
typedef cairo_int_status_t
(*_stroke_func) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -919,7 +920,7 @@ typedef cairo_int_status_t
typedef cairo_int_status_t
(*_fill_func) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -928,7 +929,7 @@ typedef cairo_int_status_t
typedef cairo_int_status_t
(*_show_glyphs_func) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -702,8 +702,8 @@ _cairo_directfb_surface_clone_similar (void *abstract_surface,
#if DFB_COMPOSITE || DFB_COMPOSITE_TRAPEZOIDS
static cairo_int_status_t
_directfb_prepare_composite (cairo_directfb_surface_t *dst,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
cairo_operator_t op,
int *src_x, int *src_y,
int *mask_x, int *mask_y,
@ -732,7 +732,7 @@ _directfb_prepare_composite (cairo_directfb_surface_t *dst,
return CAIRO_INT_STATUS_UNSUPPORTED;
if (mask_pattern->type != CAIRO_PATTERN_TYPE_SOLID) {
cairo_pattern_t *tmp;
const cairo_pattern_t *tmp;
int tmp_x, tmp_y;
if (src_pattern->type != CAIRO_PATTERN_TYPE_SOLID ||
@ -761,11 +761,6 @@ _directfb_prepare_composite (cairo_directfb_surface_t *dst,
color = _cairo_stock_color (CAIRO_STOCK_WHITE);
}
/* XXX DirectFB currently does not support filtering, so force NEAREST
* in order to hit optimisations inside core.
*/
src_pattern->filter = CAIRO_FILTER_NEAREST;
status = _cairo_pattern_acquire_surface (src_pattern, &dst->base,
*src_x, *src_y, width, height,
(cairo_surface_t **) &src,
@ -842,7 +837,7 @@ _directfb_prepare_composite (cairo_directfb_surface_t *dst,
static void
_directfb_finish_composite (cairo_directfb_surface_t *dst,
cairo_pattern_t *src_pattern,
const cairo_pattern_t *src_pattern,
cairo_surface_t *src,
cairo_surface_attributes_t *src_attr)
{
@ -892,8 +887,8 @@ _directfb_categorize_operation (cairo_surface_attributes_t *src_attr)
static cairo_int_status_t
_cairo_directfb_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x, int src_y,
int mask_x, int mask_y,
@ -1160,7 +1155,7 @@ _cairo_directfb_surface_fill_rectangles (void *abstract_surface
#if DFB_COMPOSITE_TRAPEZOIDS
static cairo_int_status_t
_cairo_directfb_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_dst,
cairo_antialias_t antialias,
int src_x, int src_y,
@ -1686,13 +1681,13 @@ _cairo_directfb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph,
}
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,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
int *remaining_glyphs)
_cairo_directfb_surface_show_glyphs (void *abstract_dst,
cairo_operator_t op,
const cairo_pattern_t *pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
int *remaining_glyphs)
{
cairo_directfb_surface_t *dst = abstract_dst;
cairo_directfb_font_cache_t *cache;

View file

@ -718,7 +718,7 @@ typedef struct _cairo_glitz_surface_attributes {
} cairo_glitz_surface_attributes_t;
static cairo_int_status_t
_cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern,
_cairo_glitz_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_glitz_surface_t *dst,
int x,
int y,
@ -937,7 +937,7 @@ _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern,
}
static void
_cairo_glitz_pattern_release_surface (cairo_pattern_t *pattern,
_cairo_glitz_pattern_release_surface (const cairo_pattern_t *pattern,
cairo_glitz_surface_t *surface,
cairo_glitz_surface_attributes_t *attr)
{
@ -948,8 +948,8 @@ _cairo_glitz_pattern_release_surface (cairo_pattern_t *pattern,
}
static cairo_int_status_t
_cairo_glitz_pattern_acquire_surfaces (cairo_pattern_t *src,
cairo_pattern_t *mask,
_cairo_glitz_pattern_acquire_surfaces (const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_glitz_surface_t *dst,
int src_x,
int src_y,
@ -985,37 +985,31 @@ _cairo_glitz_pattern_acquire_surfaces (cairo_pattern_t *src,
_cairo_pattern_init_solid (&tmp, &combined, CAIRO_CONTENT_COLOR_ALPHA);
mask = NULL;
} else {
status = _cairo_pattern_init_copy (&tmp.base, src);
if (status)
return status;
src = &tmp.base;
}
status = _cairo_glitz_pattern_acquire_surface (&tmp.base, dst,
status = _cairo_glitz_pattern_acquire_surface (src, dst,
src_x, src_y,
width, height,
src_out, sattr);
_cairo_pattern_fini (&tmp.base);
if (src == &tmp.base)
_cairo_pattern_fini (&tmp.base);
if (status)
return status;
if (mask)
{
status = _cairo_pattern_init_copy (&tmp.base, mask);
if (status)
return status;
status = _cairo_glitz_pattern_acquire_surface (&tmp.base, dst,
status = _cairo_glitz_pattern_acquire_surface (mask, dst,
mask_x, mask_y,
width, height,
mask_out, mattr);
if (status)
_cairo_glitz_pattern_release_surface (&tmp.base, *src_out, sattr);
_cairo_pattern_fini (&tmp.base);
if (status) {
/* XXX src == &tmp.base -> invalid (currently inconsequential) */
_cairo_glitz_pattern_release_surface (src, *src_out, sattr);
}
return status;
}
@ -1039,8 +1033,8 @@ _cairo_glitz_surface_set_attributes (cairo_glitz_surface_t *surface,
static cairo_int_status_t
_cairo_glitz_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
@ -1197,7 +1191,7 @@ _cairo_glitz_surface_fill_rectangles (void *abstract_dst,
static cairo_int_status_t
_cairo_glitz_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_dst,
cairo_antialias_t antialias,
int src_x,
@ -1210,7 +1204,7 @@ _cairo_glitz_surface_composite_trapezoids (cairo_operator_t op,
int n_traps)
{
cairo_pattern_union_t tmp_src_pattern;
cairo_pattern_t *src_pattern;
const cairo_pattern_t *src_pattern;
cairo_glitz_surface_attributes_t attributes;
cairo_glitz_surface_t *dst = abstract_dst;
cairo_glitz_surface_t *src;
@ -2101,7 +2095,7 @@ _cairo_glitz_surface_add_glyph (cairo_glitz_surface_t *surface,
static cairo_int_status_t
_cairo_glitz_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_surface,
int src_x,
int src_y,

View file

@ -810,34 +810,53 @@ _cairo_gstate_path_extents (cairo_gstate_t *gstate,
static cairo_status_t
_cairo_gstate_copy_transformed_pattern (cairo_gstate_t *gstate,
cairo_pattern_t *pattern,
cairo_pattern_t **pattern,
cairo_pattern_t *original,
cairo_matrix_t *ctm_inverse)
{
cairo_surface_pattern_t *surface_pattern;
cairo_surface_t *surface;
cairo_status_t status;
status = _cairo_pattern_init_copy (pattern, original);
if (status)
return status;
cairo_bool_t have_copy = FALSE;
/* apply device_transform first so that it is transformed by ctm_inverse */
if (cairo_pattern_get_type (original) == CAIRO_PATTERN_TYPE_SURFACE) {
if (original->type == CAIRO_PATTERN_TYPE_SURFACE) {
cairo_surface_pattern_t *surface_pattern;
cairo_surface_t *surface;
surface_pattern = (cairo_surface_pattern_t *) original;
surface = surface_pattern->surface;
if (_cairo_surface_has_device_transform (surface))
_cairo_pattern_transform (pattern, &surface->device_transform);
if (_cairo_surface_has_device_transform (surface)) {
status = _cairo_pattern_init_copy (*pattern, original);
if (status)
return status;
have_copy = TRUE;
_cairo_pattern_transform (*pattern, &surface->device_transform);
}
}
_cairo_pattern_transform (pattern, ctm_inverse);
if (! _cairo_matrix_is_identity (ctm_inverse)) {
if (! have_copy) {
status = _cairo_pattern_init_copy (*pattern, original);
if (status)
return status;
have_copy = TRUE;
}
_cairo_pattern_transform (*pattern, ctm_inverse);
}
if (! have_copy)
*pattern = original;
return CAIRO_STATUS_SUCCESS;
}
static cairo_status_t
_cairo_gstate_copy_transformed_source (cairo_gstate_t *gstate,
cairo_pattern_t *pattern)
_cairo_gstate_copy_transformed_source (cairo_gstate_t *gstate,
cairo_pattern_t **pattern)
{
return _cairo_gstate_copy_transformed_pattern (gstate, pattern,
gstate->source,
@ -845,9 +864,9 @@ _cairo_gstate_copy_transformed_source (cairo_gstate_t *gstate,
}
static cairo_status_t
_cairo_gstate_copy_transformed_mask (cairo_gstate_t *gstate,
cairo_pattern_t *pattern,
cairo_pattern_t *mask)
_cairo_gstate_copy_transformed_mask (cairo_gstate_t *gstate,
cairo_pattern_t **pattern,
cairo_pattern_t *mask)
{
return _cairo_gstate_copy_transformed_pattern (gstate, pattern,
mask,
@ -858,7 +877,8 @@ cairo_status_t
_cairo_gstate_paint (cairo_gstate_t *gstate)
{
cairo_status_t status;
cairo_pattern_union_t pattern;
cairo_pattern_t *pattern;
cairo_pattern_union_t pattern_stack;
if (gstate->source->status)
return gstate->source->status;
@ -867,15 +887,17 @@ _cairo_gstate_paint (cairo_gstate_t *gstate)
if (status)
return status;
status = _cairo_gstate_copy_transformed_source (gstate, &pattern.base);
pattern = &pattern_stack.base;
status = _cairo_gstate_copy_transformed_source (gstate, &pattern);
if (status)
return status;
status = _cairo_surface_paint (gstate->target,
gstate->op,
&pattern.base);
pattern);
_cairo_pattern_fini (&pattern.base);
if (pattern == &pattern_stack.base)
_cairo_pattern_fini (pattern);
return status;
}
@ -885,7 +907,8 @@ _cairo_gstate_mask (cairo_gstate_t *gstate,
cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_pattern_union_t source_pattern, mask_pattern;
cairo_pattern_union_t source_pattern_stack, mask_pattern_stack;
cairo_pattern_t *source_pattern, *mask_pattern;
if (mask->status)
return mask->status;
@ -897,22 +920,26 @@ _cairo_gstate_mask (cairo_gstate_t *gstate,
if (status)
return status;
status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
source_pattern = &source_pattern_stack.base;
status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern);
if (status)
return status;
status = _cairo_gstate_copy_transformed_mask (gstate, &mask_pattern.base, mask);
mask_pattern = &mask_pattern_stack.base;
status = _cairo_gstate_copy_transformed_mask (gstate, &mask_pattern, mask);
if (status)
goto CLEANUP_SOURCE;
status = _cairo_surface_mask (gstate->target,
gstate->op,
&source_pattern.base,
&mask_pattern.base);
source_pattern,
mask_pattern);
_cairo_pattern_fini (&mask_pattern.base);
if (mask_pattern == &mask_pattern_stack.base)
_cairo_pattern_fini (&mask_pattern_stack.base);
CLEANUP_SOURCE:
_cairo_pattern_fini (&source_pattern.base);
if (source_pattern == &source_pattern_stack.base)
_cairo_pattern_fini (&source_pattern_stack.base);
return status;
}
@ -921,7 +948,8 @@ cairo_status_t
_cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
{
cairo_status_t status;
cairo_pattern_union_t source_pattern;
cairo_pattern_union_t source_pattern_stack;
cairo_pattern_t *source_pattern;
if (gstate->source->status)
return gstate->source->status;
@ -933,14 +961,15 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
if (status)
return status;
source_pattern = &source_pattern_stack.base;
status = _cairo_gstate_copy_transformed_source (gstate,
&source_pattern.base);
&source_pattern);
if (status)
return status;
status = _cairo_surface_stroke (gstate->target,
gstate->op,
&source_pattern.base,
source_pattern,
path,
&gstate->stroke_style,
&gstate->ctm,
@ -948,10 +977,10 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
gstate->tolerance,
gstate->antialias);
_cairo_pattern_fini (&source_pattern.base);
if (source_pattern == &source_pattern_stack.base)
_cairo_pattern_fini (&source_pattern_stack.base);
return status;
}
cairo_status_t
@ -1001,7 +1030,8 @@ cairo_status_t
_cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
{
cairo_status_t status;
cairo_pattern_union_t pattern;
cairo_pattern_union_t pattern_stack;
cairo_pattern_t *pattern;
if (gstate->source->status)
return gstate->source->status;
@ -1010,19 +1040,21 @@ _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
if (status)
return status;
status = _cairo_gstate_copy_transformed_source (gstate, &pattern.base);
pattern = &pattern_stack.base;
status = _cairo_gstate_copy_transformed_source (gstate, &pattern);
if (status)
return status;
status = _cairo_surface_fill (gstate->target,
gstate->op,
&pattern.base,
pattern,
path,
gstate->fill_rule,
gstate->tolerance,
gstate->antialias);
_cairo_pattern_fini (&pattern.base);
if (pattern == &pattern_stack.base)
_cairo_pattern_fini (&pattern_stack.base);
return status;
}
@ -1582,7 +1614,8 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
cairo_text_cluster_flags_t cluster_flags)
{
cairo_status_t status;
cairo_pattern_union_t source_pattern;
cairo_pattern_union_t source_pattern_stack;
cairo_pattern_t *source_pattern;
cairo_glyph_t *transformed_glyphs;
cairo_glyph_t stack_transformed_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)];
@ -1613,7 +1646,8 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
if (status || num_glyphs == 0)
goto CLEANUP_GLYPHS;
status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base);
source_pattern = &source_pattern_stack.base;
status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern);
if (status)
goto CLEANUP_GLYPHS;
@ -1635,7 +1669,7 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
_cairo_scaled_font_get_max_scale (gstate->scaled_font) <= 10240) {
status = _cairo_surface_show_text_glyphs (gstate->target,
gstate->op,
&source_pattern.base,
source_pattern,
utf8, utf8_len,
transformed_glyphs, num_glyphs,
clusters, num_clusters,
@ -1653,7 +1687,7 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
if (status == CAIRO_STATUS_SUCCESS)
status = _cairo_surface_fill (gstate->target,
gstate->op,
&source_pattern.base,
source_pattern,
&path,
CAIRO_FILL_RULE_WINDING,
gstate->tolerance,
@ -1662,7 +1696,8 @@ _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
_cairo_path_fixed_fini (&path);
}
_cairo_pattern_fini (&source_pattern.base);
if (source_pattern == &source_pattern_stack.base)
_cairo_pattern_fini (&source_pattern_stack.base);
CLEANUP_GLYPHS:
if (transformed_glyphs != stack_transformed_glyphs)

View file

@ -939,8 +939,8 @@ _pixman_operator (cairo_operator_t op)
static cairo_int_status_t
_cairo_image_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
@ -1072,7 +1072,7 @@ _cairo_image_surface_fill_rectangles (void *abstract_surface,
static cairo_int_status_t
_cairo_image_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_dst,
cairo_antialias_t antialias,
int src_x,

View file

@ -219,7 +219,7 @@ _cairo_meta_surface_release_source_image (void *abstract_surface,
static cairo_int_status_t
_cairo_meta_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_status_t status;
cairo_meta_surface_t *meta = abstract_surface;
@ -259,8 +259,8 @@ _cairo_meta_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_meta_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_meta_surface_t *meta = abstract_surface;
@ -300,7 +300,7 @@ _cairo_meta_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_meta_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -357,7 +357,7 @@ _cairo_meta_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_meta_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -411,7 +411,7 @@ _cairo_meta_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_cairo_meta_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,

View file

@ -526,7 +526,7 @@ _cairo_paginated_surface_get_font_options (void *abstract_surfa
static cairo_int_status_t
_cairo_paginated_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_paginated_surface_t *surface = abstract_surface;
@ -542,8 +542,8 @@ _cairo_paginated_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_paginated_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_paginated_surface_t *surface = abstract_surface;
@ -553,7 +553,7 @@ _cairo_paginated_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_paginated_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -578,7 +578,7 @@ _cairo_paginated_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_paginated_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -608,7 +608,7 @@ _cairo_paginated_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_cairo_paginated_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,

View file

@ -1232,7 +1232,7 @@ _cairo_linear_pattern_classify (cairo_linear_pattern_t *pattern,
}
static cairo_int_status_t
_cairo_pattern_acquire_surface_for_gradient (cairo_gradient_pattern_t *pattern,
_cairo_pattern_acquire_surface_for_gradient (const cairo_gradient_pattern_t *pattern,
cairo_surface_t *dst,
int x,
int y,
@ -1496,7 +1496,7 @@ _cairo_pattern_solid_surface_matches_color (
}
static cairo_int_status_t
_cairo_pattern_acquire_surface_for_solid (cairo_solid_pattern_t *pattern,
_cairo_pattern_acquire_surface_for_solid (const cairo_solid_pattern_t *pattern,
cairo_surface_t *dst,
int x,
int y,
@ -1716,8 +1716,8 @@ _cairo_pattern_is_opaque (const cairo_pattern_t *abstract_pattern)
* backends do currently (see bug #10508)
*/
static cairo_filter_t
_cairo_pattern_analyze_filter (cairo_surface_pattern_t *pattern,
double *pad_out)
_cairo_pattern_analyze_filter (const cairo_surface_pattern_t *pattern,
double *pad_out)
{
double pad;
cairo_filter_t optimized_filter;
@ -1767,7 +1767,7 @@ _pixman_nearest_sample (double d)
}
static cairo_int_status_t
_cairo_pattern_acquire_surface_for_surface (cairo_surface_pattern_t *pattern,
_cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pattern,
cairo_surface_t *dst,
int x,
int y,
@ -2005,7 +2005,7 @@ _cairo_pattern_acquire_surface_for_surface (cairo_surface_pattern_t *pattern,
* Return value: %CAIRO_STATUS_SUCCESS if a surface was stored in @surface_out.
**/
cairo_int_status_t
_cairo_pattern_acquire_surface (cairo_pattern_t *pattern,
_cairo_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_surface_t *dst,
int x,
int y,
@ -2097,16 +2097,16 @@ _cairo_pattern_acquire_surface (cairo_pattern_t *pattern,
* Releases resources obtained by _cairo_pattern_acquire_surface.
**/
void
_cairo_pattern_release_surface (cairo_pattern_t *pattern,
_cairo_pattern_release_surface (const cairo_pattern_t *pattern,
cairo_surface_t *surface,
cairo_surface_attributes_t *attributes)
{
if (attributes->acquired)
{
cairo_surface_pattern_t *surface_pattern;
const cairo_surface_pattern_t *surface_pattern;
assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE);
surface_pattern = (cairo_surface_pattern_t *) pattern;
surface_pattern = (const cairo_surface_pattern_t *) pattern;
_cairo_surface_release_source_image (surface_pattern->surface,
(cairo_image_surface_t *) surface,
@ -2119,8 +2119,8 @@ _cairo_pattern_release_surface (cairo_pattern_t *pattern,
}
cairo_int_status_t
_cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
cairo_pattern_t *mask,
_cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
@ -2134,7 +2134,7 @@ _cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
cairo_surface_attributes_t *mask_attributes)
{
cairo_int_status_t status;
cairo_pattern_union_t src_tmp, mask_tmp;
cairo_pattern_union_t src_tmp;
if (src->status)
return src->status;
@ -2159,48 +2159,32 @@ _cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
_cairo_pattern_init_solid (&src_tmp.solid, &combined, CAIRO_CONTENT_COLOR_ALPHA);
src = &src_tmp.base;
mask = NULL;
}
else
{
status = _cairo_pattern_init_copy (&src_tmp.base, src);
if (status)
return status;
}
status = _cairo_pattern_acquire_surface (&src_tmp.base, dst,
status = _cairo_pattern_acquire_surface (src, dst,
src_x, src_y,
width, height,
src_out, src_attributes);
if (status) {
_cairo_pattern_fini (&src_tmp.base);
return status;
}
if (mask == NULL)
{
_cairo_pattern_fini (&src_tmp.base);
*mask_out = NULL;
return CAIRO_STATUS_SUCCESS;
}
status = _cairo_pattern_init_copy (&mask_tmp.base, mask);
if (status)
goto CLEANUP_SOURCE;
goto BAIL;
status = _cairo_pattern_acquire_surface (&mask_tmp.base, dst,
if (mask == NULL) {
*mask_out = NULL;
goto BAIL;
}
status = _cairo_pattern_acquire_surface (mask, dst,
mask_x, mask_y,
width, height,
mask_out, mask_attributes);
_cairo_pattern_fini (&mask_tmp.base);
CLEANUP_SOURCE:
if (status)
_cairo_pattern_release_surface (&src_tmp.base,
*src_out, src_attributes);
_cairo_pattern_release_surface (src, *src_out, src_attributes);
_cairo_pattern_fini (&src_tmp.base);
BAIL:
if (src == &src_tmp.base)
_cairo_pattern_fini (&src_tmp.base);
return status;
}
@ -2218,16 +2202,16 @@ CLEANUP_SOURCE:
* with a little more work.
**/
cairo_status_t
_cairo_pattern_get_extents (cairo_pattern_t *pattern,
cairo_rectangle_int_t *extents)
_cairo_pattern_get_extents (const cairo_pattern_t *pattern,
cairo_rectangle_int_t *extents)
{
if (pattern->extend == CAIRO_EXTEND_NONE &&
pattern->type == CAIRO_PATTERN_TYPE_SURFACE)
{
cairo_status_t status;
cairo_rectangle_int_t surface_extents;
cairo_surface_pattern_t *surface_pattern =
(cairo_surface_pattern_t *) pattern;
const cairo_surface_pattern_t *surface_pattern =
(const cairo_surface_pattern_t *) pattern;
cairo_surface_t *surface = surface_pattern->surface;
cairo_matrix_t imatrix;
double x1, y1, x2, y2;

View file

@ -774,7 +774,7 @@ _cairo_pdf_surface_add_smask_group (cairo_pdf_surface_t *surface,
static cairo_status_t
_cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_pdf_resource_t *pattern_res,
cairo_pdf_resource_t *gstate_res)
{
@ -807,10 +807,13 @@ _cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface,
}
}
pdf_pattern.pattern = cairo_pattern_reference (pattern);
status = _cairo_pattern_create_copy (&pdf_pattern.pattern, pattern);
if (status)
return status;
pdf_pattern.pattern_res = _cairo_pdf_surface_new_object (surface);
if (pdf_pattern.pattern_res.id == 0) {
cairo_pattern_destroy (pattern);
cairo_pattern_destroy (pdf_pattern.pattern);
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
}
@ -822,7 +825,7 @@ _cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface,
if (_cairo_pattern_is_opaque (pattern) == FALSE) {
pdf_pattern.gstate_res = _cairo_pdf_surface_new_object (surface);
if (pdf_pattern.gstate_res.id == 0) {
cairo_pattern_destroy (pattern);
cairo_pattern_destroy (pdf_pattern.pattern);
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
}
}
@ -835,7 +838,7 @@ _cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface,
status = _cairo_array_append (&surface->patterns, &pdf_pattern);
if (status) {
cairo_pattern_destroy (pattern);
cairo_pattern_destroy (pdf_pattern.pattern);
return status;
}
@ -2616,16 +2619,16 @@ _cairo_pdf_surface_emit_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern
static cairo_status_t
_cairo_pdf_surface_select_pattern (cairo_pdf_surface_t *surface,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_pdf_resource_t pattern_res,
cairo_bool_t is_stroke)
{
cairo_status_t status;
int alpha;
cairo_color_t *solid_color = NULL;
const cairo_color_t *solid_color = NULL;
if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) {
cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) pattern;
const cairo_solid_pattern_t *solid = (const cairo_solid_pattern_t *) pattern;
solid_color = &solid->color;
}
@ -4257,11 +4260,11 @@ _surface_pattern_supported (cairo_surface_pattern_t *pattern)
}
static cairo_bool_t
_gradient_pattern_supported (cairo_pattern_t *pattern)
_gradient_pattern_supported (const cairo_pattern_t *pattern)
{
cairo_extend_t extend;
extend = cairo_pattern_get_extend (pattern);
extend = cairo_pattern_get_extend ((cairo_pattern_t *) pattern);
/* Radial gradients are currently only supported with EXTEND_NONE
@ -4292,7 +4295,7 @@ _gradient_pattern_supported (cairo_pattern_t *pattern)
}
static cairo_bool_t
_pattern_supported (cairo_pattern_t *pattern)
_pattern_supported (const cairo_pattern_t *pattern)
{
if (pattern->type == CAIRO_PATTERN_TYPE_SOLID)
return TRUE;
@ -4310,10 +4313,13 @@ _pattern_supported (cairo_pattern_t *pattern)
static cairo_int_status_t
_cairo_pdf_surface_analyze_operation (cairo_pdf_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
if (surface->force_fallbacks && surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE)
if (surface->force_fallbacks &&
surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE)
{
return CAIRO_INT_STATUS_UNSUPPORTED;
}
if (! _pattern_supported (pattern))
return CAIRO_INT_STATUS_UNSUPPORTED;
@ -4368,7 +4374,7 @@ _cairo_pdf_surface_analyze_operation (cairo_pdf_surface_t *surface,
static cairo_bool_t
_cairo_pdf_surface_operation_supported (cairo_pdf_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
if (_cairo_pdf_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED)
return TRUE;
@ -4396,7 +4402,7 @@ _cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface)
static cairo_int_status_t
_cairo_pdf_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_pdf_surface_t *surface = abstract_surface;
cairo_status_t status;
@ -4427,7 +4433,11 @@ _cairo_pdf_surface_paint (void *abstract_surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
group->operation = PDF_PAINT;
group->source = cairo_pattern_reference (source);
status = _cairo_pattern_create_copy (&group->source, source);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
group->source_res = pattern_res;
status = _cairo_pdf_surface_add_smask_group (surface, group);
if (status) {
@ -4471,8 +4481,8 @@ _cairo_pdf_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_pdf_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_pdf_surface_t *surface = abstract_surface;
cairo_pdf_smask_group_t *group;
@ -4505,8 +4515,16 @@ _cairo_pdf_surface_mask (void *abstract_surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
group->operation = PDF_MASK;
group->source = cairo_pattern_reference (source);
group->mask = cairo_pattern_reference (mask);
status = _cairo_pattern_create_copy (&group->source, source);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
status = _cairo_pattern_create_copy (&group->mask, mask);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
group->source_res = _cairo_pdf_surface_new_object (surface);
if (group->source_res.id == 0) {
_cairo_pdf_smask_group_destroy (group);
@ -4542,7 +4560,7 @@ _cairo_pdf_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_pdf_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -4574,7 +4592,11 @@ _cairo_pdf_surface_stroke (void *abstract_surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
group->operation = PDF_STROKE;
group->source = cairo_pattern_reference (source);
status = _cairo_pattern_create_copy (&group->source, source);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
group->source_res = pattern_res;
status = _cairo_path_fixed_init_copy (&group->path, path);
if (status) {
@ -4631,7 +4653,7 @@ _cairo_pdf_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_pdf_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -4666,7 +4688,11 @@ _cairo_pdf_surface_fill (void *abstract_surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
group->operation = PDF_FILL;
group->source = cairo_pattern_reference (source);
status = _cairo_pattern_create_copy (&group->source, source);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
group->source_res = pattern_res;
status = _cairo_path_fixed_init_copy (&group->path, path);
if (status) {
@ -4719,13 +4745,13 @@ _cairo_pdf_surface_fill (void *abstract_surface,
static cairo_int_status_t
_cairo_pdf_surface_fill_stroke (void *abstract_surface,
cairo_operator_t fill_op,
cairo_pattern_t *fill_source,
const cairo_pattern_t *fill_source,
cairo_fill_rule_t fill_rule,
double fill_tolerance,
cairo_antialias_t fill_antialias,
cairo_path_fixed_t *path,
cairo_operator_t stroke_op,
cairo_pattern_t *stroke_source,
const cairo_pattern_t *stroke_source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
@ -4812,8 +4838,8 @@ _cairo_pdf_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_cairo_pdf_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_operator_t op,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,
@ -4847,7 +4873,11 @@ _cairo_pdf_surface_show_text_glyphs (void *abstract_surface,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
group->operation = PDF_SHOW_GLYPHS;
group->source = cairo_pattern_reference (source);
status = _cairo_pattern_create_copy (&group->source, source);
if (status) {
_cairo_pdf_smask_group_destroy (group);
return status;
}
group->source_res = pattern_res;
if (utf8_len) {

View file

@ -1437,7 +1437,7 @@ _cairo_ps_surface_analyze_surface_pattern_transparency (cairo_ps_surface_t
}
static cairo_bool_t
surface_pattern_supported (cairo_surface_pattern_t *pattern)
surface_pattern_supported (const cairo_surface_pattern_t *pattern)
{
cairo_extend_t extend;
@ -1478,9 +1478,9 @@ surface_pattern_supported (cairo_surface_pattern_t *pattern)
static cairo_bool_t
_gradient_pattern_supported (cairo_ps_surface_t *surface,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern;
const cairo_gradient_pattern_t *gradient = (const cairo_gradient_pattern_t *) pattern;
uint16_t alpha;
cairo_extend_t extend;
unsigned int i;
@ -1499,7 +1499,7 @@ _gradient_pattern_supported (cairo_ps_surface_t *surface,
return FALSE;
}
extend = cairo_pattern_get_extend (pattern);
extend = cairo_pattern_get_extend ((cairo_pattern_t *) pattern);
/* Radial gradients are currently only supported when one circle
* is inside the other. */
@ -1531,7 +1531,7 @@ _gradient_pattern_supported (cairo_ps_surface_t *surface,
}
static cairo_bool_t
pattern_supported (cairo_ps_surface_t *surface, cairo_pattern_t *pattern)
pattern_supported (cairo_ps_surface_t *surface, const cairo_pattern_t *pattern)
{
if (pattern->type == CAIRO_PATTERN_TYPE_SOLID)
return TRUE;
@ -1549,10 +1549,13 @@ pattern_supported (cairo_ps_surface_t *surface, cairo_pattern_t *pattern)
static cairo_int_status_t
_cairo_ps_surface_analyze_operation (cairo_ps_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
if (surface->force_fallbacks && surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE)
if (surface->force_fallbacks &&
surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE)
{
return CAIRO_INT_STATUS_UNSUPPORTED;
}
if (! pattern_supported (surface, pattern))
return CAIRO_INT_STATUS_UNSUPPORTED;
@ -1597,7 +1600,7 @@ _cairo_ps_surface_analyze_operation (cairo_ps_surface_t *surface,
static cairo_bool_t
_cairo_ps_surface_operation_supported (cairo_ps_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
if (_cairo_ps_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED)
return TRUE;
@ -2888,7 +2891,7 @@ _cairo_ps_surface_emit_radial_pattern (cairo_ps_surface_t *surface,
static cairo_status_t
_cairo_ps_surface_emit_pattern (cairo_ps_surface_t *surface,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_operator_t op)
{
cairo_status_t status;
@ -3018,7 +3021,7 @@ _cairo_ps_surface_get_font_options (void *abstract_surface,
static cairo_int_status_t
_cairo_ps_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_ps_surface_t *surface = abstract_surface;
cairo_output_stream_t *stream = surface->stream;
@ -3077,7 +3080,7 @@ _cairo_ps_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_ps_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -3111,12 +3114,12 @@ _cairo_ps_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_ps_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_ps_surface_t *surface = abstract_surface;
cairo_int_status_t status;
@ -3174,7 +3177,7 @@ _cairo_ps_surface_fill (void *abstract_surface,
static cairo_int_status_t
_cairo_ps_surface_show_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -688,7 +688,7 @@ CreateGradientFunction (cairo_gradient_pattern_t *gpat)
0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy
};
return CGFunctionCreate (gpat,
return CGFunctionCreate (_cairo_pattern_create_copy (&gpat->base),
1,
input_value_range,
4,
@ -766,7 +766,7 @@ CreateRepeatingGradientFunction (cairo_quartz_surface_t *surface,
input_value_range[0] = 0.0 - 1.0 * rep_start;
input_value_range[1] = 1.0 + 1.0 * rep_end;
return CGFunctionCreate (gpat,
return CGFunctionCreate (_cairo_pattern_create_copy (&gpat->base),
1,
input_value_range,
4,
@ -1096,9 +1096,6 @@ _cairo_quartz_setup_linear_source (cairo_quartz_surface_t *surface,
end = CGPointMake (_cairo_fixed_to_double (lpat->p2.x),
_cairo_fixed_to_double (lpat->p2.y));
// ref will be released by the CGShading's destructor
cairo_pattern_reference ((cairo_pattern_t*) lpat);
if (abspat->extend == CAIRO_EXTEND_NONE ||
abspat->extend == CAIRO_EXTEND_PAD)
{
@ -1159,9 +1156,6 @@ _cairo_quartz_setup_radial_source (cairo_quartz_surface_t *surface,
end = CGPointMake (_cairo_fixed_to_double (rpat->c2.x),
_cairo_fixed_to_double (rpat->c2.y));
// ref will be released by the CGShading's destructor
cairo_pattern_reference ((cairo_pattern_t*) rpat);
gradFunc = CreateGradientFunction ((cairo_gradient_pattern_t*) rpat);
surface->sourceShading = CGShadingCreateRadial (rgb,

View file

@ -1785,7 +1785,7 @@ _cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font,
cairo_status_t
_cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *surface,
int source_x,
int source_y,

View file

@ -208,18 +208,18 @@ _cairo_sdl_surface_clone_similar (void *abstract_surface,
}
static cairo_int_status_t
_cairo_sdl_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
_cairo_sdl_surface_composite (cairo_operator_t op,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height)
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height)
{
cairo_sdl_surface_t *dst = abstract_dst;
cairo_sdl_surface_t *src;

View file

@ -42,19 +42,20 @@
#include "cairoint.h"
cairo_private cairo_status_t
_cairo_surface_fallback_paint (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source);
_cairo_surface_fallback_paint (cairo_surface_t *surface,
cairo_operator_t op,
const cairo_pattern_t *source);
cairo_private cairo_status_t
_cairo_surface_fallback_mask (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask);
const cairo_pattern_t *source,
const cairo_pattern_t *mask);
cairo_private cairo_status_t
_cairo_surface_fallback_stroke (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
@ -65,16 +66,16 @@ _cairo_surface_fallback_stroke (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_fallback_fill (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
double tolerance,
cairo_antialias_t antialias);
cairo_private cairo_status_t
_cairo_surface_fallback_show_glyphs (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font);
@ -83,18 +84,18 @@ cairo_private cairo_surface_t *
_cairo_surface_fallback_snapshot (cairo_surface_t *surface);
cairo_private cairo_status_t
_cairo_surface_fallback_composite (cairo_operator_t op,
cairo_pattern_t *src,
cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height);
_cairo_surface_fallback_composite (cairo_operator_t op,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height);
cairo_private cairo_status_t
_cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface,
@ -105,7 +106,7 @@ _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_fallback_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_antialias_t antialias,
int src_x,

View file

@ -103,7 +103,7 @@ _fallback_fini (fallback_state_t *state)
typedef cairo_status_t (*cairo_draw_func_t) (void *closure,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_surface_t *dst,
int dst_x,
int dst_y,
@ -156,7 +156,7 @@ _create_composite_mask_pattern (cairo_surface_pattern_t *mask_pattern,
static cairo_status_t
_clip_and_composite_with_mask (cairo_clip_t *clip,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_draw_func_t draw_func,
void *draw_closure,
cairo_surface_t *dst,
@ -190,7 +190,7 @@ _clip_and_composite_with_mask (cairo_clip_t *clip,
static cairo_status_t
_clip_and_composite_combine (cairo_clip_t *clip,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_draw_func_t draw_func,
void *draw_closure,
cairo_surface_t *dst,
@ -278,7 +278,7 @@ _clip_and_composite_combine (cairo_clip_t *clip,
*/
static cairo_status_t
_clip_and_composite_source (cairo_clip_t *clip,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_draw_func_t draw_func,
void *draw_closure,
cairo_surface_t *dst,
@ -352,7 +352,7 @@ _cairo_rectangle_empty (const cairo_rectangle_int_t *rect)
static cairo_status_t
_clip_and_composite (cairo_clip_t *clip,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_draw_func_t draw_func,
void *draw_closure,
cairo_surface_t *dst,
@ -408,7 +408,7 @@ _clip_and_composite (cairo_clip_t *clip,
*/
static cairo_status_t
_composite_trap_region (cairo_clip_t *clip,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_operator_t op,
cairo_surface_t *dst,
cairo_region_t *trap_region,
@ -480,7 +480,7 @@ typedef struct {
static cairo_status_t
_composite_traps_draw_func (void *closure,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_surface_t *dst,
int dst_x,
int dst_y,
@ -512,7 +512,7 @@ _composite_traps_draw_func (void *closure,
/* Warning: This call modifies the coordinates of traps */
static cairo_status_t
_clip_and_composite_trapezoids (cairo_pattern_t *src,
_clip_and_composite_trapezoids (const cairo_pattern_t *src,
cairo_operator_t op,
cairo_surface_t *dst,
cairo_traps_t *traps,
@ -671,9 +671,9 @@ out:
}
cairo_status_t
_cairo_surface_fallback_paint (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source)
_cairo_surface_fallback_paint (cairo_surface_t *surface,
cairo_operator_t op,
const cairo_pattern_t *source)
{
cairo_status_t status;
cairo_rectangle_int_t extents;
@ -686,6 +686,7 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface,
if (_cairo_operator_bounded_by_source (op)) {
cairo_rectangle_int_t source_extents;
status = _cairo_pattern_get_extents (source, &source_extents);
if (status)
return status;
@ -717,7 +718,7 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface,
static cairo_status_t
_cairo_surface_mask_draw_func (void *closure,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_surface_t *dst,
int dst_x,
int dst_y,
@ -744,8 +745,8 @@ _cairo_surface_mask_draw_func (void *closure,
cairo_status_t
_cairo_surface_fallback_mask (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_rectangle_int_t extents, source_extents, mask_extents;
@ -779,7 +780,7 @@ _cairo_surface_fallback_mask (cairo_surface_t *surface,
status = _clip_and_composite (surface->clip, op,
source,
_cairo_surface_mask_draw_func,
mask,
(void *) mask,
surface,
&extents);
@ -789,7 +790,7 @@ _cairo_surface_fallback_mask (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_fallback_stroke (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
@ -852,7 +853,7 @@ FAIL:
cairo_status_t
_cairo_surface_fallback_fill (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -920,7 +921,7 @@ typedef struct {
static cairo_status_t
_cairo_surface_old_show_glyphs_draw_func (void *closure,
cairo_operator_t op,
cairo_pattern_t *src,
const cairo_pattern_t *src,
cairo_surface_t *dst,
int dst_x,
int dst_y,
@ -981,7 +982,7 @@ _cairo_surface_old_show_glyphs_draw_func (void *closure
cairo_status_t
_cairo_surface_fallback_show_glyphs (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font)
@ -1080,18 +1081,18 @@ _cairo_surface_fallback_snapshot (cairo_surface_t *surface)
}
cairo_status_t
_cairo_surface_fallback_composite (cairo_operator_t op,
cairo_pattern_t *src,
cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height)
_cairo_surface_fallback_composite (cairo_operator_t op,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
int mask_x,
int mask_y,
int dst_x,
int dst_y,
unsigned int width,
unsigned int height)
{
fallback_state_t state;
cairo_status_t status;
@ -1197,7 +1198,7 @@ _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_fallback_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_antialias_t antialias,
int src_x,

View file

@ -89,9 +89,9 @@ static DEFINE_NIL_SURFACE(CAIRO_STATUS_WRITE_ERROR, _cairo_surface_nil_write_err
static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STRIDE, _cairo_surface_nil_invalid_stride);
static cairo_status_t
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern,
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t **pattern,
cairo_surface_t *destination,
cairo_pattern_t **pattern_out);
cairo_pattern_t *pattern_copy);
/**
* _cairo_surface_set_error:
@ -337,7 +337,7 @@ _cairo_surface_create_similar_solid (cairo_surface_t *other,
cairo_surface_t *
_cairo_surface_create_solid_pattern_surface (cairo_surface_t *other,
cairo_solid_pattern_t *solid_pattern)
const cairo_solid_pattern_t *solid_pattern)
{
cairo_surface_t *surface;
@ -357,7 +357,7 @@ _cairo_surface_create_solid_pattern_surface (cairo_surface_t *other,
cairo_int_status_t
_cairo_surface_repaint_solid_pattern_surface (cairo_surface_t *other,
cairo_surface_t *solid_surface,
cairo_solid_pattern_t *solid_pattern)
const cairo_solid_pattern_t *solid_pattern)
{
if (other->backend->create_solid_pattern_surface)
/* Solid pattern surface for this backend are not trivial to make.
@ -1254,8 +1254,8 @@ _cairo_surface_is_similar (cairo_surface_t *surface_a,
cairo_status_t
_cairo_surface_composite (cairo_operator_t op,
cairo_pattern_t *src,
cairo_pattern_t *mask,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
@ -1469,69 +1469,78 @@ _cairo_surface_fill_rectangles (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_paint (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_status_t status;
cairo_pattern_t *dev_source;
cairo_pattern_union_t dev_source;
if (surface->status)
return surface->status;
assert (! surface->is_snapshot);
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
status = _cairo_surface_copy_pattern_for_destination (&source,
surface,
&dev_source.base);
if (status)
return _cairo_surface_set_error (surface, status);
if (surface->backend->paint) {
status = surface->backend->paint (surface, op, dev_source);
status = surface->backend->paint (surface, op, source);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
goto FINISH;
}
status = _cairo_surface_fallback_paint (surface, op, dev_source);
status = _cairo_surface_fallback_paint (surface, op, source);
FINISH:
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
return _cairo_surface_set_error (surface, status);
}
cairo_status_t
_cairo_surface_mask (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
_cairo_surface_mask (cairo_surface_t *surface,
cairo_operator_t op,
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_pattern_t *dev_source;
cairo_pattern_t *dev_mask;
cairo_pattern_union_t dev_source;
cairo_pattern_union_t dev_mask;
if (surface->status)
return surface->status;
assert (! surface->is_snapshot);
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
status = _cairo_surface_copy_pattern_for_destination (&source,
surface,
&dev_source.base);
if (status)
goto FINISH;
status = _cairo_surface_copy_pattern_for_destination (mask, surface, &dev_mask);
status = _cairo_surface_copy_pattern_for_destination (&mask,
surface,
&dev_mask.base);
if (status)
goto CLEANUP_SOURCE;
if (surface->backend->mask) {
status = surface->backend->mask (surface, op, dev_source, dev_mask);
status = surface->backend->mask (surface, op, source, mask);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
goto CLEANUP_MASK;
}
status = _cairo_surface_fallback_mask (surface, op, dev_source, dev_mask);
status = _cairo_surface_fallback_mask (surface, op, source, mask);
CLEANUP_MASK:
cairo_pattern_destroy (dev_mask);
if (mask == &dev_mask.base)
_cairo_pattern_fini (&dev_mask.base);
CLEANUP_SOURCE:
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
FINISH:
return _cairo_surface_set_error (surface, status);
@ -1540,13 +1549,13 @@ _cairo_surface_mask (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_fill_stroke (cairo_surface_t *surface,
cairo_operator_t fill_op,
cairo_pattern_t *fill_source,
const cairo_pattern_t *fill_source,
cairo_fill_rule_t fill_rule,
double fill_tolerance,
cairo_antialias_t fill_antialias,
cairo_path_fixed_t *path,
cairo_operator_t stroke_op,
cairo_pattern_t *stroke_source,
const cairo_pattern_t *stroke_source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
@ -1559,29 +1568,41 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
return surface->status;
if (surface->backend->fill_stroke) {
cairo_pattern_t *dev_stroke_source;
cairo_pattern_t *dev_fill_source;
cairo_pattern_union_t dev_stroke_source;
cairo_pattern_union_t dev_fill_source;
cairo_matrix_t dev_ctm = *stroke_ctm;
cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse;
status = _cairo_surface_copy_pattern_for_destination (stroke_source, surface, &dev_stroke_source);
status = _cairo_surface_copy_pattern_for_destination (&stroke_source,
surface,
&dev_stroke_source.base);
if (status)
return _cairo_surface_set_error (surface, status);
status = _cairo_surface_copy_pattern_for_destination (fill_source, surface, &dev_fill_source);
status = _cairo_surface_copy_pattern_for_destination (&fill_source,
surface,
&dev_fill_source.base);
if (status) {
cairo_pattern_destroy (dev_stroke_source);
if (stroke_source == &dev_stroke_source.base)
_cairo_pattern_fini (&dev_stroke_source.base);
return _cairo_surface_set_error (surface, status);
}
status = surface->backend->fill_stroke (surface, fill_op, dev_fill_source,
fill_rule, fill_tolerance, fill_antialias,
path, stroke_op, dev_stroke_source, stroke_style,
&dev_ctm, &dev_ctm_inverse, stroke_tolerance,
stroke_antialias);
status = surface->backend->fill_stroke (surface,
fill_op, fill_source, fill_rule,
fill_tolerance, fill_antialias,
path,
stroke_op, stroke_source,
stroke_style,
&dev_ctm, &dev_ctm_inverse,
stroke_tolerance, stroke_antialias);
cairo_pattern_destroy (dev_stroke_source);
cairo_pattern_destroy (dev_fill_source);
if (stroke_source == &dev_stroke_source.base)
_cairo_pattern_fini (&dev_stroke_source.base);
if (fill_source == &dev_fill_source.base)
_cairo_pattern_fini (&dev_fill_source.base);
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
return _cairo_surface_set_error (surface, status);
@ -1604,7 +1625,7 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_stroke (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
@ -1613,7 +1634,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
cairo_antialias_t antialias)
{
cairo_status_t status;
cairo_pattern_t *dev_source;
cairo_pattern_union_t dev_source;
cairo_path_fixed_t *dev_path = path;
cairo_path_fixed_t real_dev_path;
cairo_matrix_t dev_ctm = *ctm;
@ -1624,12 +1645,14 @@ _cairo_surface_stroke (cairo_surface_t *surface,
assert (! surface->is_snapshot);
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
status = _cairo_surface_copy_pattern_for_destination (&source,
surface,
&dev_source.base);
if (status)
return _cairo_surface_set_error (surface, status);
if (surface->backend->stroke) {
status = surface->backend->stroke (surface, op, dev_source,
status = surface->backend->stroke (surface, op, source,
path, stroke_style,
&dev_ctm, &dev_ctm_inverse,
tolerance, antialias);
@ -1638,7 +1661,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
goto FINISH;
}
status = _cairo_surface_fallback_stroke (surface, op, dev_source,
status = _cairo_surface_fallback_stroke (surface, op, source,
path, stroke_style,
&dev_ctm, &dev_ctm_inverse,
tolerance, antialias);
@ -1646,7 +1669,9 @@ _cairo_surface_stroke (cairo_surface_t *surface,
FINISH:
if (dev_path == &real_dev_path)
_cairo_path_fixed_fini (&real_dev_path);
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
return _cairo_surface_set_error (surface, status);
}
@ -1654,26 +1679,28 @@ _cairo_surface_stroke (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_fill (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_status_t status;
cairo_pattern_t *dev_source;
cairo_pattern_union_t dev_source;
if (surface->status)
return surface->status;
assert (! surface->is_snapshot);
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
status = _cairo_surface_copy_pattern_for_destination (&source,
surface,
&dev_source.base);
if (status)
return _cairo_surface_set_error (surface, status);
if (surface->backend->fill) {
status = surface->backend->fill (surface, op, dev_source,
status = surface->backend->fill (surface, op, source,
path, fill_rule,
tolerance, antialias);
@ -1681,19 +1708,20 @@ _cairo_surface_fill (cairo_surface_t *surface,
goto FINISH;
}
status = _cairo_surface_fallback_fill (surface, op, dev_source,
status = _cairo_surface_fallback_fill (surface, op, source,
path, fill_rule,
tolerance, antialias);
FINISH:
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
return _cairo_surface_set_error (surface, status);
}
cairo_status_t
_cairo_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_antialias_t antialias,
int src_x,
@ -2218,7 +2246,7 @@ slim_hidden_def (cairo_surface_has_show_text_glyphs);
cairo_status_t
_cairo_surface_show_text_glyphs (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,
@ -2230,7 +2258,7 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
{
cairo_status_t status;
cairo_scaled_font_t *dev_scaled_font = scaled_font;
cairo_pattern_t *dev_source;
cairo_pattern_union_t dev_source;
if (surface->status)
return surface->status;
@ -2240,9 +2268,9 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
if (!num_glyphs && !utf8_len)
return CAIRO_STATUS_SUCCESS;
status = _cairo_surface_copy_pattern_for_destination (source,
status = _cairo_surface_copy_pattern_for_destination (&source,
surface,
&dev_source);
&dev_source.base);
if (status)
return _cairo_surface_set_error (surface, status);
@ -2263,7 +2291,9 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
}
status = cairo_scaled_font_status (dev_scaled_font);
if (status) {
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
return _cairo_surface_set_error (surface, status);
}
@ -2275,7 +2305,8 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
/* A real show_text_glyphs call. Try show_text_glyphs backend
* method first */
if (surface->backend->show_text_glyphs) {
status = surface->backend->show_text_glyphs (surface, op, dev_source,
status = surface->backend->show_text_glyphs (surface, op,
source,
utf8, utf8_len,
glyphs, num_glyphs,
clusters, num_clusters, cluster_flags,
@ -2283,7 +2314,8 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
}
if (status == CAIRO_INT_STATUS_UNSUPPORTED && surface->backend->show_glyphs) {
int remaining_glyphs = num_glyphs;
status = surface->backend->show_glyphs (surface, op, dev_source,
status = surface->backend->show_glyphs (surface, op,
source,
glyphs, num_glyphs,
dev_scaled_font,
&remaining_glyphs);
@ -2296,7 +2328,8 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
/* A mere show_glyphs call. Try show_glyphs backend method first */
if (surface->backend->show_glyphs) {
int remaining_glyphs = num_glyphs;
status = surface->backend->show_glyphs (surface, op, dev_source,
status = surface->backend->show_glyphs (surface, op,
source,
glyphs, num_glyphs,
dev_scaled_font,
&remaining_glyphs);
@ -2313,7 +2346,8 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
* implies that UTF-8 is not NULL, unless the text is
* zero-length).
*/
status = surface->backend->show_text_glyphs (surface, op, dev_source,
status = surface->backend->show_text_glyphs (surface, op,
source,
utf8, utf8_len,
glyphs, num_glyphs,
clusters, num_clusters, cluster_flags,
@ -2322,14 +2356,16 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
}
if (status == CAIRO_INT_STATUS_UNSUPPORTED)
status = _cairo_surface_fallback_show_glyphs (surface, op, dev_source,
status = _cairo_surface_fallback_show_glyphs (surface, op,
source,
glyphs, num_glyphs,
dev_scaled_font);
if (dev_scaled_font != scaled_font)
cairo_scaled_font_destroy (dev_scaled_font);
cairo_pattern_destroy (dev_source);
if (source == &dev_source.base)
_cairo_pattern_fini (&dev_source.base);
return _cairo_surface_set_error (surface, status);
}
@ -2342,7 +2378,7 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *dst,
int source_x,
int source_y,
@ -2594,27 +2630,30 @@ _cairo_surface_composite_shape_fixup_unbounded (cairo_surface_t *dst,
* _cairo_surface_copy_pattern_for_destination
* @pattern: the pattern to copy
* @destination: the destination surface for which the pattern is being copied
* @pattern_out: the location to hold the copy
* @pattern_copy: the location to hold the copy
*
* Copies the given pattern, taking into account device scale and offsets
* of the destination surface.
*/
static cairo_status_t
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern,
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t **pattern,
cairo_surface_t *destination,
cairo_pattern_t **pattern_out)
cairo_pattern_t *pattern_copy)
{
cairo_status_t status;
status = _cairo_pattern_create_copy (pattern_out, pattern);
if (! _cairo_surface_has_device_transform (destination))
return CAIRO_STATUS_SUCCESS;
status = _cairo_pattern_init_copy (pattern_copy, *pattern);
if (status)
return status;
if (_cairo_surface_has_device_transform (destination)) {
_cairo_pattern_transform (*pattern_out,
&destination->device_transform_inverse);
}
_cairo_pattern_transform (pattern_copy,
&destination->device_transform_inverse);
*pattern = pattern_copy;
return CAIRO_STATUS_SUCCESS;
}

View file

@ -1757,7 +1757,7 @@ _cairo_svg_surface_emit_radial_pattern (cairo_svg_surface_t *surface,
static cairo_status_t
_cairo_svg_surface_emit_pattern (cairo_svg_surface_t *surface,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_output_stream_t *output,
cairo_bool_t is_stroke,
const cairo_matrix_t *parent_matrix)
@ -1783,12 +1783,12 @@ _cairo_svg_surface_emit_pattern (cairo_svg_surface_t *surface,
}
static cairo_status_t
_cairo_svg_surface_emit_fill_style (cairo_output_stream_t *output,
cairo_svg_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_fill_rule_t fill_rule,
cairo_matrix_t *parent_matrix)
_cairo_svg_surface_emit_fill_style (cairo_output_stream_t *output,
cairo_svg_surface_t *surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_fill_rule_t fill_rule,
cairo_matrix_t *parent_matrix)
{
_cairo_output_stream_printf (output,
"fill-rule:%s;",
@ -1799,12 +1799,12 @@ _cairo_svg_surface_emit_fill_style (cairo_output_stream_t *output,
}
static cairo_status_t
_cairo_svg_surface_emit_stroke_style (cairo_output_stream_t *output,
cairo_svg_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *parent_matrix)
_cairo_svg_surface_emit_stroke_style (cairo_output_stream_t *output,
cairo_svg_surface_t *surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *parent_matrix)
{
cairo_status_t status;
const char *line_cap, *line_join;
@ -1879,13 +1879,13 @@ _cairo_svg_surface_emit_stroke_style (cairo_output_stream_t *output,
static cairo_int_status_t
_cairo_svg_surface_fill_stroke (void *abstract_surface,
cairo_operator_t fill_op,
cairo_pattern_t *fill_source,
const cairo_pattern_t *fill_source,
cairo_fill_rule_t fill_rule,
double fill_tolerance,
cairo_antialias_t fill_antialias,
cairo_path_fixed_t *path,
cairo_operator_t stroke_op,
cairo_pattern_t *stroke_source,
const cairo_pattern_t *stroke_source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
@ -1921,7 +1921,7 @@ _cairo_svg_surface_fill_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_svg_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -1974,8 +1974,8 @@ static cairo_status_t
_cairo_svg_surface_emit_paint (cairo_output_stream_t *output,
cairo_svg_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask_source,
const cairo_pattern_t *source,
const cairo_pattern_t *mask_source,
const char *extra_attributes)
{
cairo_status_t status;
@ -2013,7 +2013,7 @@ _cairo_svg_surface_emit_paint (cairo_output_stream_t *output,
static cairo_int_status_t
_cairo_svg_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_status_t status;
cairo_svg_surface_t *surface = abstract_surface;
@ -2066,8 +2066,8 @@ _cairo_svg_surface_paint (void *abstract_surface,
static cairo_int_status_t
_cairo_svg_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
cairo_status_t status;
cairo_svg_surface_t *surface = abstract_surface;
@ -2095,8 +2095,8 @@ _cairo_svg_surface_mask (void *abstract_surface,
assert (_cairo_svg_surface_operation_supported (surface, op, source));
assert (_cairo_svg_surface_operation_supported (surface, CAIRO_OPERATOR_OVER, mask));
if (cairo_pattern_get_type (mask) == CAIRO_PATTERN_TYPE_SURFACE) {
cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t*) mask;
if (mask->type == CAIRO_PATTERN_TYPE_SURFACE) {
const cairo_surface_pattern_t *surface_pattern = (const cairo_surface_pattern_t*) mask;
cairo_content_t content = cairo_surface_get_content (surface_pattern->surface);
if (content == CAIRO_CONTENT_ALPHA)
discard_filter = TRUE;
@ -2148,7 +2148,7 @@ _cairo_svg_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_svg_surface_stroke (void *abstract_dst,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *ctm,
@ -2185,7 +2185,7 @@ _cairo_svg_surface_stroke (void *abstract_dst,
static cairo_int_status_t
_cairo_svg_surface_show_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -123,7 +123,7 @@ _cairo_type3_glyph_surface_emit_image (cairo_type3_glyph_surface_t *surface,
static cairo_status_t
_cairo_type3_glyph_surface_emit_image_pattern (cairo_type3_glyph_surface_t *surface,
cairo_image_surface_t *image,
cairo_matrix_t *pattern_matrix)
const cairo_matrix_t *pattern_matrix)
{
cairo_matrix_t mat, upside_down;
cairo_status_t status;
@ -182,10 +182,10 @@ _cairo_type3_glyph_surface_intersect_clip_path (void *abstract_surface,
static cairo_int_status_t
_cairo_type3_glyph_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_type3_glyph_surface_t *surface = abstract_surface;
cairo_surface_pattern_t *pattern;
const cairo_surface_pattern_t *pattern;
cairo_image_surface_t *image;
void *image_extra;
cairo_status_t status;
@ -193,7 +193,7 @@ _cairo_type3_glyph_surface_paint (void *abstract_surface,
if (source->type != CAIRO_PATTERN_TYPE_SURFACE)
return CAIRO_INT_STATUS_IMAGE_FALLBACK;
pattern = (cairo_surface_pattern_t *) source;
pattern = (const cairo_surface_pattern_t *) source;
status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra);
if (status)
goto fail;
@ -211,8 +211,8 @@ fail:
static cairo_int_status_t
_cairo_type3_glyph_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
return _cairo_type3_glyph_surface_paint (abstract_surface, op, mask);
}
@ -220,7 +220,7 @@ _cairo_type3_glyph_surface_mask (void *abstract_surface,
static cairo_int_status_t
_cairo_type3_glyph_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -240,7 +240,7 @@ _cairo_type3_glyph_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_type3_glyph_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -259,7 +259,7 @@ _cairo_type3_glyph_surface_fill (void *abstract_surface,
static cairo_int_status_t
_cairo_type3_glyph_surface_show_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -1359,19 +1359,19 @@ _cairo_win32_scaled_font_glyph_init (void *abstract_font,
}
static cairo_int_status_t
_cairo_win32_scaled_font_show_glyphs (void *abstract_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
cairo_surface_t *generic_surface,
int source_x,
int source_y,
int dest_x,
int dest_y,
unsigned int width,
unsigned int height,
cairo_glyph_t *glyphs,
int num_glyphs,
int *remaining_glyphs)
_cairo_win32_scaled_font_show_glyphs (void *abstract_font,
cairo_operator_t op,
const cairo_pattern_t *pattern,
cairo_surface_t *generic_surface,
int source_x,
int source_y,
int dest_x,
int dest_y,
unsigned int width,
unsigned int height,
cairo_glyph_t *glyphs,
int num_glyphs,
int *remaining_glyphs)
{
cairo_win32_scaled_font_t *scaled_font = abstract_font;
cairo_win32_surface_t *surface = (cairo_win32_surface_t *)generic_surface;

View file

@ -294,7 +294,7 @@ _cairo_win32_printing_surface_flatten_transparency (cairo_win32_surface_t *surfa
static cairo_status_t
_cairo_win32_printing_surface_select_solid_brush (cairo_win32_surface_t *surface,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
cairo_solid_pattern_t *pattern = (cairo_solid_pattern_t *) source;
COLORREF color;
@ -337,7 +337,7 @@ _cairo_win32_printing_surface_get_ctm_clip_box (cairo_win32_surface_t *surface,
static cairo_status_t
_cairo_win32_printing_surface_paint_solid_pattern (cairo_win32_surface_t *surface,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
RECT clip;
cairo_status_t status;
@ -350,7 +350,7 @@ _cairo_win32_printing_surface_paint_solid_pattern (cairo_win32_surface_t *surfac
FillRect (surface->dc, &clip, surface->brush);
_cairo_win32_printing_surface_done_solid_brush (surface);
return 0;
return CAIRO_STATUS_SUCCESS;
}
static cairo_status_t
@ -411,7 +411,9 @@ _cairo_win32_printing_surface_paint_meta_pattern (cairo_win32_surface_t *surfa
surface->content = CAIRO_CONTENT_COLOR;
_cairo_pattern_init_solid (&black, CAIRO_COLOR_BLACK, CAIRO_CONTENT_COLOR);
source = (cairo_pattern_t*) &black;
_cairo_win32_printing_surface_paint_solid_pattern (surface, source);
status = _cairo_win32_printing_surface_paint_solid_pattern (surface, source);
if (status)
return status;
}
for (y_tile = top; y_tile < bottom; y_tile++) {
@ -490,7 +492,6 @@ _cairo_win32_printing_surface_paint_image_pattern (cairo_win32_surface_t *surf
{
cairo_status_t status;
cairo_extend_t extend;
cairo_surface_attributes_t pat_attr;
cairo_image_surface_t *image;
void *image_extra;
cairo_surface_t *opaque_surface;
@ -820,7 +821,7 @@ _cairo_win32_printing_surface_paint_linear_pattern (cairo_win32_surface_t *surfa
static cairo_int_status_t
_cairo_win32_printing_surface_paint_pattern (cairo_win32_surface_t *surface,
cairo_pattern_t *pattern)
const cairo_pattern_t *pattern)
{
cairo_status_t status;
@ -1034,9 +1035,9 @@ _cairo_win32_printing_surface_get_font_options (void *abstract_
}
static cairo_int_status_t
_cairo_win32_printing_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
_cairo_win32_printing_surface_paint (void *abstract_surface,
cairo_operator_t op,
const cairo_pattern_t *source)
{
cairo_win32_surface_t *surface = abstract_surface;
cairo_solid_pattern_t clear;
@ -1105,15 +1106,15 @@ _cairo_matrix_factor_out_scale (cairo_matrix_t *m, double *scale)
}
static cairo_int_status_t
_cairo_win32_printing_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
_cairo_win32_printing_surface_stroke (void *abstract_surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
{
cairo_win32_surface_t *surface = abstract_surface;
cairo_int_status_t status;
@ -1229,12 +1230,12 @@ _cairo_win32_printing_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_cairo_win32_printing_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
cairo_win32_surface_t *surface = abstract_surface;
cairo_int_status_t status;
@ -1289,7 +1290,7 @@ _cairo_win32_printing_surface_fill (void *abstract_surface,
static cairo_int_status_t
_cairo_win32_printing_surface_show_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -141,7 +141,7 @@ _cairo_win32_flags_for_dc (HDC dc);
cairo_int_status_t
_cairo_win32_surface_show_glyphs (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -874,8 +874,8 @@ _cairo_win32_surface_composite_inner (cairo_win32_surface_t *src,
static cairo_int_status_t
_cairo_win32_surface_composite (cairo_operator_t op,
cairo_pattern_t *pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
@ -1562,7 +1562,7 @@ _cairo_win32_surface_flush (void *abstract_surface)
cairo_int_status_t
_cairo_win32_surface_show_glyphs (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -948,10 +948,10 @@ typedef enum {
* hit the bug and won't be able to use a core protocol fallback.
*/
static composite_operation_t
_categorize_composite_operation (cairo_xcb_surface_t *dst,
cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_bool_t have_mask)
_categorize_composite_operation (cairo_xcb_surface_t *dst,
cairo_operator_t op,
const cairo_pattern_t *src_pattern,
cairo_bool_t have_mask)
{
#if XXX_BUGGY_REPEAT
@ -1088,8 +1088,8 @@ _render_operator (cairo_operator_t op)
static cairo_int_status_t
_cairo_xcb_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
@ -1377,7 +1377,7 @@ _create_trapezoid_mask (cairo_xcb_surface_t *dst,
static cairo_int_status_t
_cairo_xcb_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_dst,
cairo_antialias_t antialias,
int src_x,
@ -1622,13 +1622,13 @@ _cairo_xcb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph,
cairo_scaled_font_t *scaled_font);
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,
int *remaining_glyphs);
_cairo_xcb_surface_show_glyphs (void *abstract_dst,
cairo_operator_t op,
const cairo_pattern_t *src_pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
int *remaining_glyphs);
static cairo_bool_t
_cairo_xcb_surface_is_similar (void *surface_a,
@ -2420,13 +2420,13 @@ _cairo_xcb_surface_emit_glyphs (cairo_xcb_surface_t *dst,
}
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,
int *remaining_glyphs)
_cairo_xcb_surface_show_glyphs (void *abstract_dst,
cairo_operator_t op,
const cairo_pattern_t *src_pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
int *remaining_glyphs)
{
cairo_int_status_t status = CAIRO_STATUS_SUCCESS;
cairo_xcb_surface_t *dst = abstract_dst;

View file

@ -82,7 +82,7 @@ _native_byte_order_lsb (void);
static cairo_int_status_t
_cairo_xlib_surface_show_glyphs (void *abstract_dst,
cairo_operator_t op,
cairo_pattern_t *src_pattern,
const cairo_pattern_t *src_pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
@ -1229,7 +1229,7 @@ _cairo_xlib_surface_clone_similar (void *abstract_surface,
static cairo_surface_t *
_cairo_xlib_surface_create_solid_pattern_surface (void *abstract_surface,
cairo_solid_pattern_t *solid_pattern)
const cairo_solid_pattern_t *solid_pattern)
{
/* This function's only responsibility is to create a proper surface
* for when XRender is not available. The proper surface is a xlib
@ -1531,7 +1531,7 @@ typedef enum {
static composite_operation_t
_categorize_composite_operation (cairo_xlib_surface_t *dst,
cairo_operator_t op,
cairo_pattern_t *src_pattern,
const cairo_pattern_t *src_pattern,
cairo_bool_t have_mask)
{
@ -1680,8 +1680,8 @@ _render_operator (cairo_operator_t op)
static cairo_int_status_t
_cairo_xlib_surface_composite (cairo_operator_t op,
cairo_pattern_t *src_pattern,
cairo_pattern_t *mask_pattern,
const cairo_pattern_t *src_pattern,
const cairo_pattern_t *mask_pattern,
void *abstract_dst,
int src_x,
int src_y,
@ -2071,7 +2071,7 @@ _create_trapezoid_mask (cairo_xlib_surface_t *dst,
static cairo_int_status_t
_cairo_xlib_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *abstract_dst,
cairo_antialias_t antialias,
int src_x,
@ -3945,7 +3945,7 @@ _cairo_xlib_surface_owns_font (cairo_xlib_surface_t *dst,
static cairo_int_status_t
_cairo_xlib_surface_show_glyphs (void *abstract_dst,
cairo_operator_t op,
cairo_pattern_t *src_pattern,
const cairo_pattern_t *src_pattern,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,

View file

@ -453,7 +453,7 @@ struct _cairo_scaled_font_backend {
cairo_warn cairo_int_status_t
(*show_glyphs) (void *scaled_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *surface,
int source_x,
int source_y,
@ -584,8 +584,8 @@ struct _cairo_surface_backend {
/* XXX: dst should be the first argument for consistency */
cairo_warn cairo_int_status_t
(*composite) (cairo_operator_t op,
cairo_pattern_t *src,
cairo_pattern_t *mask,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
void *dst,
int src_x,
int src_y,
@ -606,7 +606,7 @@ struct _cairo_surface_backend {
/* XXX: dst should be the first argument for consistency */
cairo_warn cairo_int_status_t
(*composite_trapezoids) (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *dst,
cairo_antialias_t antialias,
int src_x,
@ -688,7 +688,7 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*old_show_glyphs) (cairo_scaled_font_t *font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
void *surface,
int source_x,
int source_y,
@ -726,18 +726,18 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*paint) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source);
const cairo_pattern_t *source);
cairo_warn cairo_int_status_t
(*mask) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask);
const cairo_pattern_t *source,
const cairo_pattern_t *mask);
cairo_warn cairo_int_status_t
(*stroke) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -748,7 +748,7 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*fill) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -757,7 +757,7 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*show_glyphs) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_glyph_t *glyphs,
int num_glyphs,
cairo_scaled_font_t *scaled_font,
@ -777,13 +777,13 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*fill_stroke) (void *surface,
cairo_operator_t fill_op,
cairo_pattern_t *fill_source,
const cairo_pattern_t *fill_source,
cairo_fill_rule_t fill_rule,
double fill_tolerance,
cairo_antialias_t fill_antialias,
cairo_path_fixed_t *path,
cairo_operator_t stroke_op,
cairo_pattern_t *stroke_source,
const cairo_pattern_t *stroke_source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
@ -792,8 +792,8 @@ struct _cairo_surface_backend {
cairo_surface_t *
(*create_solid_pattern_surface)
(void *surface,
cairo_solid_pattern_t *solid_pattern);
(void *surface,
const cairo_solid_pattern_t *solid_pattern);
cairo_bool_t
(*has_show_text_glyphs) (void *surface);
@ -801,7 +801,7 @@ struct _cairo_surface_backend {
cairo_warn cairo_int_status_t
(*show_text_glyphs) (void *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,
@ -1581,7 +1581,7 @@ _cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font,
cairo_private cairo_status_t
_cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_surface_t *surface,
int source_x,
int source_y,
@ -1676,12 +1676,12 @@ _cairo_surface_create_similar_solid (cairo_surface_t *other,
cairo_private cairo_surface_t *
_cairo_surface_create_solid_pattern_surface (cairo_surface_t *other,
cairo_solid_pattern_t *solid_pattern);
const cairo_solid_pattern_t *solid_pattern);
cairo_private cairo_int_status_t
_cairo_surface_repaint_solid_pattern_surface (cairo_surface_t *other,
cairo_surface_t *solid_surface,
cairo_solid_pattern_t *solid_pattern);
const cairo_solid_pattern_t *solid_pattern);
cairo_private void
_cairo_surface_init (cairo_surface_t *surface,
@ -1697,8 +1697,8 @@ _cairo_surface_get_clip_mode (cairo_surface_t *surface);
cairo_private cairo_status_t
_cairo_surface_composite (cairo_operator_t op,
cairo_pattern_t *src,
cairo_pattern_t *mask,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
@ -1734,24 +1734,24 @@ _cairo_surface_fill_rectangles (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_paint (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source);
const cairo_pattern_t *source);
cairo_private cairo_status_t
_cairo_surface_mask (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask);
const cairo_pattern_t *source,
const cairo_pattern_t *mask);
cairo_private cairo_status_t
_cairo_surface_fill_stroke (cairo_surface_t *surface,
cairo_operator_t fill_op,
cairo_pattern_t *fill_source,
const cairo_pattern_t *fill_source,
cairo_fill_rule_t fill_rule,
double fill_tolerance,
cairo_antialias_t fill_antialias,
cairo_path_fixed_t *path,
cairo_operator_t stroke_op,
cairo_pattern_t *stroke_source,
const cairo_pattern_t *stroke_source,
cairo_stroke_style_t *stroke_style,
cairo_matrix_t *stroke_ctm,
cairo_matrix_t *stroke_ctm_inverse,
@ -1761,7 +1761,7 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_stroke (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
@ -1772,7 +1772,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_fill (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -1781,7 +1781,7 @@ _cairo_surface_fill (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_show_text_glyphs (cairo_surface_t *surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,
@ -1793,7 +1793,7 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_composite_trapezoids (cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_antialias_t antialias,
int src_x,
@ -1885,7 +1885,7 @@ _cairo_surface_get_extents (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
cairo_operator_t op,
cairo_pattern_t *pattern,
const cairo_pattern_t *pattern,
cairo_surface_t *surface,
int source_x,
int source_y,
@ -2318,7 +2318,7 @@ cairo_private cairo_bool_t
_cairo_pattern_is_opaque (const cairo_pattern_t *abstract_pattern);
cairo_private cairo_int_status_t
_cairo_pattern_acquire_surface (cairo_pattern_t *pattern,
_cairo_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_surface_t *dst,
int x,
int y,
@ -2328,13 +2328,13 @@ _cairo_pattern_acquire_surface (cairo_pattern_t *pattern,
cairo_surface_attributes_t *attributes);
cairo_private void
_cairo_pattern_release_surface (cairo_pattern_t *pattern,
_cairo_pattern_release_surface (const cairo_pattern_t *pattern,
cairo_surface_t *surface,
cairo_surface_attributes_t *attributes);
cairo_private cairo_int_status_t
_cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
cairo_pattern_t *mask,
_cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
int src_x,
int src_y,
@ -2348,8 +2348,8 @@ _cairo_pattern_acquire_surfaces (cairo_pattern_t *src,
cairo_surface_attributes_t *mask_attributes);
cairo_private cairo_status_t
_cairo_pattern_get_extents (cairo_pattern_t *pattern,
cairo_rectangle_int_t *extents);
_cairo_pattern_get_extents (const cairo_pattern_t *pattern,
cairo_rectangle_int_t *extents);
cairo_private void
_cairo_pattern_reset_static_data (void);

View file

@ -194,7 +194,7 @@ _test_meta_surface_get_extents (void *abstract_surface,
static cairo_int_status_t
_test_meta_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
test_meta_surface_t *surface = abstract_surface;
@ -206,8 +206,8 @@ _test_meta_surface_paint (void *abstract_surface,
static cairo_int_status_t
_test_meta_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
test_meta_surface_t *surface = abstract_surface;
@ -217,15 +217,15 @@ _test_meta_surface_mask (void *abstract_surface,
}
static cairo_int_status_t
_test_meta_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
_test_meta_surface_stroke (void *abstract_surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
{
test_meta_surface_t *surface = abstract_surface;
@ -240,7 +240,7 @@ _test_meta_surface_stroke (void *abstract_surface,
static cairo_int_status_t
_test_meta_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
@ -266,7 +266,7 @@ _test_meta_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_test_meta_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,

View file

@ -169,7 +169,7 @@ _test_paginated_surface_get_extents (void *abstract_surface,
static cairo_int_status_t
_test_paginated_surface_paint (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source)
const cairo_pattern_t *source)
{
test_paginated_surface_t *surface = abstract_surface;
@ -182,8 +182,8 @@ _test_paginated_surface_paint (void *abstract_surface,
static cairo_int_status_t
_test_paginated_surface_mask (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_pattern_t *mask)
const cairo_pattern_t *source,
const cairo_pattern_t *mask)
{
test_paginated_surface_t *surface = abstract_surface;
@ -194,15 +194,15 @@ _test_paginated_surface_mask (void *abstract_surface,
}
static cairo_int_status_t
_test_paginated_surface_stroke (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
_test_paginated_surface_stroke (void *abstract_surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_stroke_style_t *style,
cairo_matrix_t *ctm,
cairo_matrix_t *ctm_inverse,
double tolerance,
cairo_antialias_t antialias)
{
test_paginated_surface_t *surface = abstract_surface;
@ -216,13 +216,13 @@ _test_paginated_surface_stroke (void *abstract_surface,
}
static cairo_int_status_t
_test_paginated_surface_fill (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
_test_paginated_surface_fill (void *abstract_surface,
cairo_operator_t op,
const cairo_pattern_t *source,
cairo_path_fixed_t *path,
cairo_fill_rule_t fill_rule,
double tolerance,
cairo_antialias_t antialias)
{
test_paginated_surface_t *surface = abstract_surface;
@ -245,7 +245,7 @@ _test_paginated_surface_has_show_text_glyphs (void *abstract_surface)
static cairo_int_status_t
_test_paginated_surface_show_text_glyphs (void *abstract_surface,
cairo_operator_t op,
cairo_pattern_t *source,
const cairo_pattern_t *source,
const char *utf8,
int utf8_len,
cairo_glyph_t *glyphs,