diff --git a/src/cairo-svg-surface-private.h b/src/cairo-svg-surface-private.h index ddbf464b1..9c9f908b7 100644 --- a/src/cairo-svg-surface-private.h +++ b/src/cairo-svg-surface-private.h @@ -55,6 +55,7 @@ typedef struct cairo_svg_surface { double width; double height; + cairo_bool_t surface_bounded; cairo_svg_document_t *document; diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index e04eccc0b..a9b32e6d8 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -176,7 +176,9 @@ static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, cairo_content_t content, double width, - double height); + double height, + cairo_bool_t bounded); + static cairo_surface_t * _cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, double width, @@ -470,7 +472,8 @@ static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, cairo_content_t content, double width, - double height) + double height, + cairo_bool_t bounded) { cairo_svg_surface_t *surface; cairo_surface_t *paginated; @@ -488,6 +491,7 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, surface->width = width; surface->height = height; + surface->surface_bounded = bounded; surface->document = _cairo_svg_document_reference (document); @@ -561,7 +565,7 @@ _cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, } surface = _cairo_svg_surface_create_for_document (document, CAIRO_CONTENT_COLOR_ALPHA, - width, height); + width, height, TRUE); if (surface->status) { status = _cairo_svg_document_destroy (document); return surface; @@ -1396,6 +1400,8 @@ _cairo_svg_surface_emit_recording_surface (cairo_svg_document_t *document, cairo_surface_t *paginated_surface; cairo_svg_surface_t *svg_surface; cairo_array_t *page_set; + cairo_rectangle_int_t extents; + cairo_bool_t bounded; cairo_output_stream_t *contents; @@ -1405,10 +1411,12 @@ _cairo_svg_surface_emit_recording_surface (cairo_svg_document_t *document, return CAIRO_STATUS_SUCCESS; } + bounded = _cairo_surface_get_extents (&source->base, &extents); paginated_surface = _cairo_svg_surface_create_for_document (document, source->base.content, - source->extents_pixels.width, - source->extents_pixels.height); + extents.width, + extents.height, + bounded); if (unlikely (paginated_surface->status)) return paginated_surface->status; @@ -1436,13 +1444,17 @@ _cairo_svg_surface_emit_recording_surface (cairo_svg_document_t *document, if (! svg_surface->is_base_clip_emitted) { svg_surface->is_base_clip_emitted = TRUE; - _cairo_output_stream_printf (document->xml_node_defs, - "\n" - " \n" - "\n", - svg_surface->base_clip, - svg_surface->width, - svg_surface->height); + if (_cairo_surface_get_extents (&svg_surface->base, &extents)) { + _cairo_output_stream_printf (document->xml_node_defs, + "\n" + " \n" + "\n", + svg_surface->base_clip, + extents.x, + extents.y, + extents.width, + extents.height); + } } if (source->base.content == CAIRO_CONTENT_ALPHA) { @@ -2258,7 +2270,7 @@ _cairo_svg_surface_get_extents (void *abstract_surface, rectangle->width = ceil (surface->width); rectangle->height = ceil (surface->height); - return TRUE; + return surface->surface_bounded; } static cairo_status_t