mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-04 18:00:21 +01:00
Use _cairo_pattern_create_copy() in cairo-surface.c
Use _cairo_pattern_create_copy()/cairo_pattern_destroy() instead of _cairo_pattern_init_copy()/_cairo_pattern_fini() so the PDF backend can reference the patterns and destroy them later.
This commit is contained in:
parent
6ead8feaf3
commit
b4e0864b96
1 changed files with 42 additions and 42 deletions
|
|
@ -86,7 +86,7 @@ DEFINE_NIL_SURFACE(CAIRO_STATUS_WRITE_ERROR, _cairo_surface_nil_write_error);
|
|||
static cairo_status_t
|
||||
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern,
|
||||
cairo_surface_t *destination,
|
||||
cairo_pattern_t *pattern_out);
|
||||
cairo_pattern_t **pattern_out);
|
||||
|
||||
/**
|
||||
* _cairo_surface_set_error:
|
||||
|
|
@ -1395,24 +1395,24 @@ _cairo_surface_paint (cairo_surface_t *surface,
|
|||
cairo_pattern_t *source)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_pattern_union_t dev_source;
|
||||
cairo_pattern_t *dev_source;
|
||||
|
||||
assert (! surface->is_snapshot);
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
|
||||
if (status)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
||||
if (surface->backend->paint) {
|
||||
status = surface->backend->paint (surface, op, &dev_source.base);
|
||||
status = surface->backend->paint (surface, op, dev_source);
|
||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
goto FINISH;
|
||||
}
|
||||
|
||||
status = _cairo_surface_fallback_paint (surface, op, &dev_source.base);
|
||||
status = _cairo_surface_fallback_paint (surface, op, dev_source);
|
||||
|
||||
FINISH:
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
|
@ -1424,31 +1424,31 @@ _cairo_surface_mask (cairo_surface_t *surface,
|
|||
cairo_pattern_t *mask)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_pattern_union_t dev_source;
|
||||
cairo_pattern_union_t dev_mask;
|
||||
cairo_pattern_t *dev_source;
|
||||
cairo_pattern_t *dev_mask;
|
||||
|
||||
assert (! surface->is_snapshot);
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
|
||||
if (status)
|
||||
goto FINISH;
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (mask, surface, &dev_mask.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (mask, surface, &dev_mask);
|
||||
if (status)
|
||||
goto CLEANUP_SOURCE;
|
||||
|
||||
if (surface->backend->mask) {
|
||||
status = surface->backend->mask (surface, op, &dev_source.base, &dev_mask.base);
|
||||
status = surface->backend->mask (surface, op, dev_source, dev_mask);
|
||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
goto CLEANUP_MASK;
|
||||
}
|
||||
|
||||
status = _cairo_surface_fallback_mask (surface, op, &dev_source.base, &dev_mask.base);
|
||||
status = _cairo_surface_fallback_mask (surface, op, dev_source, dev_mask);
|
||||
|
||||
CLEANUP_MASK:
|
||||
_cairo_pattern_fini (&dev_mask.base);
|
||||
cairo_pattern_destroy (dev_mask);
|
||||
CLEANUP_SOURCE:
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
FINISH:
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
|
@ -1473,29 +1473,29 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
|
|||
cairo_status_t status;
|
||||
|
||||
if (surface->backend->fill_stroke) {
|
||||
cairo_pattern_union_t dev_stroke_source;
|
||||
cairo_pattern_union_t dev_fill_source;
|
||||
cairo_pattern_t *dev_stroke_source;
|
||||
cairo_pattern_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.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (stroke_source, surface, &dev_stroke_source);
|
||||
if (status)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (fill_source, surface, &dev_fill_source.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (fill_source, surface, &dev_fill_source);
|
||||
if (status) {
|
||||
_cairo_pattern_fini (&dev_stroke_source.base);
|
||||
cairo_pattern_destroy (dev_stroke_source);
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
||||
status = surface->backend->fill_stroke (surface, fill_op, &dev_fill_source.base,
|
||||
status = surface->backend->fill_stroke (surface, fill_op, dev_fill_source,
|
||||
fill_rule, fill_tolerance, fill_antialias,
|
||||
path, stroke_op, &dev_stroke_source.base, stroke_style,
|
||||
path, stroke_op, dev_stroke_source, stroke_style,
|
||||
&dev_ctm, &dev_ctm_inverse, stroke_tolerance,
|
||||
stroke_antialias);
|
||||
|
||||
_cairo_pattern_fini (&dev_stroke_source.base);
|
||||
_cairo_pattern_fini (&dev_fill_source.base);
|
||||
cairo_pattern_destroy (dev_stroke_source);
|
||||
cairo_pattern_destroy (dev_fill_source);
|
||||
|
||||
if (status != CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
|
@ -1527,7 +1527,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
|||
cairo_antialias_t antialias)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_pattern_union_t dev_source;
|
||||
cairo_pattern_t *dev_source;
|
||||
cairo_path_fixed_t *dev_path = path;
|
||||
cairo_path_fixed_t real_dev_path;
|
||||
cairo_matrix_t dev_ctm = *ctm;
|
||||
|
|
@ -1535,12 +1535,12 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
|||
|
||||
assert (! surface->is_snapshot);
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
|
||||
if (status)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
||||
if (surface->backend->stroke) {
|
||||
status = surface->backend->stroke (surface, op, &dev_source.base,
|
||||
status = surface->backend->stroke (surface, op, dev_source,
|
||||
path, stroke_style,
|
||||
&dev_ctm, &dev_ctm_inverse,
|
||||
tolerance, antialias);
|
||||
|
|
@ -1549,7 +1549,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
|||
goto FINISH;
|
||||
}
|
||||
|
||||
status = _cairo_surface_fallback_stroke (surface, op, &dev_source.base,
|
||||
status = _cairo_surface_fallback_stroke (surface, op, dev_source,
|
||||
path, stroke_style,
|
||||
&dev_ctm, &dev_ctm_inverse,
|
||||
tolerance, antialias);
|
||||
|
|
@ -1557,7 +1557,7 @@ _cairo_surface_stroke (cairo_surface_t *surface,
|
|||
FINISH:
|
||||
if (dev_path == &real_dev_path)
|
||||
_cairo_path_fixed_fini (&real_dev_path);
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
|
@ -1572,16 +1572,16 @@ _cairo_surface_fill (cairo_surface_t *surface,
|
|||
cairo_antialias_t antialias)
|
||||
{
|
||||
cairo_status_t status;
|
||||
cairo_pattern_union_t dev_source;
|
||||
cairo_pattern_t *dev_source;
|
||||
|
||||
assert (! surface->is_snapshot);
|
||||
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source.base);
|
||||
status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source);
|
||||
if (status)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
||||
if (surface->backend->fill) {
|
||||
status = surface->backend->fill (surface, op, &dev_source.base,
|
||||
status = surface->backend->fill (surface, op, dev_source,
|
||||
path, fill_rule,
|
||||
tolerance, antialias);
|
||||
|
||||
|
|
@ -1589,12 +1589,12 @@ _cairo_surface_fill (cairo_surface_t *surface,
|
|||
goto FINISH;
|
||||
}
|
||||
|
||||
status = _cairo_surface_fallback_fill (surface, op, &dev_source.base,
|
||||
status = _cairo_surface_fallback_fill (surface, op, dev_source,
|
||||
path, fill_rule,
|
||||
tolerance, antialias);
|
||||
|
||||
FINISH:
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
|
@ -2045,7 +2045,7 @@ _cairo_surface_show_glyphs (cairo_surface_t *surface,
|
|||
{
|
||||
cairo_status_t status;
|
||||
cairo_scaled_font_t *dev_scaled_font = scaled_font;
|
||||
cairo_pattern_union_t dev_source;
|
||||
cairo_pattern_t *dev_source;
|
||||
cairo_matrix_t font_matrix;
|
||||
|
||||
assert (! surface->is_snapshot);
|
||||
|
|
@ -2055,7 +2055,7 @@ _cairo_surface_show_glyphs (cairo_surface_t *surface,
|
|||
|
||||
status = _cairo_surface_copy_pattern_for_destination (source,
|
||||
surface,
|
||||
&dev_source.base);
|
||||
&dev_source);
|
||||
if (status)
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
|
||||
|
|
@ -2080,7 +2080,7 @@ _cairo_surface_show_glyphs (cairo_surface_t *surface,
|
|||
}
|
||||
status = cairo_scaled_font_status (dev_scaled_font);
|
||||
if (status) {
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
||||
|
|
@ -2089,12 +2089,12 @@ _cairo_surface_show_glyphs (cairo_surface_t *surface,
|
|||
status = CAIRO_INT_STATUS_UNSUPPORTED;
|
||||
|
||||
if (surface->backend->show_glyphs)
|
||||
status = surface->backend->show_glyphs (surface, op, &dev_source.base,
|
||||
status = surface->backend->show_glyphs (surface, op, dev_source,
|
||||
glyphs, num_glyphs,
|
||||
dev_scaled_font);
|
||||
|
||||
if (status == CAIRO_INT_STATUS_UNSUPPORTED)
|
||||
status = _cairo_surface_fallback_show_glyphs (surface, op, &dev_source.base,
|
||||
status = _cairo_surface_fallback_show_glyphs (surface, op, dev_source,
|
||||
glyphs, num_glyphs,
|
||||
dev_scaled_font);
|
||||
|
||||
|
|
@ -2103,7 +2103,7 @@ _cairo_surface_show_glyphs (cairo_surface_t *surface,
|
|||
if (dev_scaled_font != scaled_font)
|
||||
cairo_scaled_font_destroy (dev_scaled_font);
|
||||
|
||||
_cairo_pattern_fini (&dev_source.base);
|
||||
cairo_pattern_destroy (dev_source);
|
||||
|
||||
return _cairo_surface_set_error (surface, status);
|
||||
}
|
||||
|
|
@ -2370,11 +2370,11 @@ _cairo_surface_composite_shape_fixup_unbounded (cairo_surface_t *dst,
|
|||
static cairo_status_t
|
||||
_cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern,
|
||||
cairo_surface_t *destination,
|
||||
cairo_pattern_t *pattern_out)
|
||||
cairo_pattern_t **pattern_out)
|
||||
{
|
||||
cairo_status_t status;
|
||||
|
||||
status = _cairo_pattern_init_copy (pattern_out, pattern);
|
||||
status = _cairo_pattern_create_copy (pattern_out, pattern);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
|
|
@ -2387,7 +2387,7 @@ _cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern,
|
|||
* matrix should always be invertible. */
|
||||
assert (status == CAIRO_STATUS_SUCCESS);
|
||||
|
||||
_cairo_pattern_transform (pattern_out, &device_to_surface);
|
||||
_cairo_pattern_transform (*pattern_out, &device_to_surface);
|
||||
}
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue