From 7c39276366f91de151c775fa8293783f39247896 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 22 Feb 2007 13:40:55 -0500 Subject: [PATCH] [PS/PDF] Accept CAIRO_EXTEND_REFLECT surface patterns natively With the hack in _cairo_pattern_acquire_surface to return a 2x2 surface for reflected patterns, we can now accept REFLECT surface patterns natively in all backends. SVG was already doing that. The PDF case needed some changes to go through _cairo_pattern_acquire_surface. A similar change to the recent change in SVG. --- src/cairo-pdf-surface.c | 19 +++++++++++++++---- src/cairo-ps-surface.c | 4 ++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index fa6c8307d..3b8830d14 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -870,6 +870,8 @@ emit_surface_pattern (cairo_pdf_surface_t *surface, cairo_surface_pattern_t *pattern) { cairo_pdf_resource_t stream; + cairo_surface_t *pat_surface; + cairo_surface_attributes_t pat_attr; cairo_image_surface_t *image; void *image_extra; cairo_status_t status = CAIRO_STATUS_SUCCESS; @@ -883,10 +885,17 @@ emit_surface_pattern (cairo_pdf_surface_t *surface, _cairo_pdf_surface_pause_content_stream (surface); - status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra); + status = _cairo_pattern_acquire_surface ((cairo_pattern_t *)pattern, + (cairo_surface_t *)surface, + 0, 0, -1, -1, + &pat_surface, &pat_attr); if (status) return status; + status = _cairo_surface_acquire_source_image (pat_surface, &image, &image_extra); + if (status) + goto BAIL2; + status = emit_image (surface, image, &image_resource); if (status) goto BAIL; @@ -929,12 +938,12 @@ emit_surface_pattern (cairo_pdf_surface_t *surface, } break; case CAIRO_EXTEND_REPEAT: + case CAIRO_EXTEND_REFLECT: xstep = image->width; ystep = image->height; break; /* All the rest should have been analyzed away, so this case * should be unreachable. */ - case CAIRO_EXTEND_REFLECT: case CAIRO_EXTEND_PAD: default: ASSERT_NOT_REACHED; @@ -1018,7 +1027,9 @@ emit_surface_pattern (cairo_pdf_surface_t *surface, stream.id, stream.id, alpha.id); BAIL: - _cairo_surface_release_source_image (pattern->surface, image, image_extra); + _cairo_surface_release_source_image (pat_surface, image, image_extra); + BAIL2: + _cairo_pattern_release_surface ((cairo_pattern_t *)pattern, pat_surface, &pat_attr); return status; } @@ -2559,8 +2570,8 @@ _surface_pattern_supported (cairo_surface_pattern_t *pattern) switch (extend) { case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_REPEAT: - return TRUE; case CAIRO_EXTEND_REFLECT: + return TRUE; case CAIRO_EXTEND_PAD: return FALSE; } diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index 7306f4c43..6e71842a0 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -1355,8 +1355,8 @@ surface_pattern_supported (const cairo_surface_pattern_t *pattern) switch (extend) { case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_REPEAT: - return TRUE; case CAIRO_EXTEND_REFLECT: + return TRUE; case CAIRO_EXTEND_PAD: return FALSE; } @@ -1759,12 +1759,12 @@ emit_surface_pattern (cairo_ps_surface_t *surface, ystep = MAX (image->height, surface->height); break; case CAIRO_EXTEND_REPEAT: + case CAIRO_EXTEND_REFLECT: xstep = image->width; ystep = image->height; break; /* All the rest should have been analyzed away, so these cases * should be unreachable. */ - case CAIRO_EXTEND_REFLECT: case CAIRO_EXTEND_PAD: default: ASSERT_NOT_REACHED;