From b0d570c3cb397fff1c24127cbb2e7925fec49afd Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Mon, 29 Aug 2011 21:36:36 +0930 Subject: [PATCH] ps/pdf: use a new clipper object when emitting a recording surface --- src/cairo-pdf-surface.c | 6 ++++++ src/cairo-ps-surface.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 49e5e84..f164435 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -2244,6 +2244,7 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, { double old_width, old_height; cairo_paginated_mode_t old_paginated_mode; + cairo_surface_clipper_t old_clipper; cairo_rectangle_int_t recording_extents; cairo_bool_t is_bounded; cairo_status_t status; @@ -2255,6 +2256,9 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, old_width = surface->width; old_height = surface->height; old_paginated_mode = surface->paginated_mode; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_pdf_surface_clipper_intersect_clip_path); _cairo_pdf_surface_set_size_internal (surface, recording_extents.width, @@ -2291,6 +2295,8 @@ _cairo_pdf_surface_emit_recording_surface (cairo_pdf_surface_t *surface, status = _cairo_pdf_surface_close_content_stream (surface); + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; _cairo_pdf_surface_set_size_internal (surface, old_width, old_height); diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index 4ae1aee..55e5935 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -2422,6 +2422,7 @@ _cairo_ps_surface_emit_recording_surface (cairo_ps_surface_t *surface, cairo_matrix_t old_cairo_to_ps; cairo_content_t old_content; cairo_rectangle_int_t old_page_bbox; + cairo_surface_clipper_t old_clipper; cairo_box_t bbox; cairo_status_t status; @@ -2430,6 +2431,9 @@ _cairo_ps_surface_emit_recording_surface (cairo_ps_surface_t *surface, old_height = surface->height; old_page_bbox = surface->page_bbox; old_cairo_to_ps = surface->cairo_to_ps; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_ps_surface_clipper_intersect_clip_path); status = _cairo_recording_surface_get_bbox ((cairo_recording_surface_t *) recording_surface, @@ -2481,6 +2485,9 @@ _cairo_ps_surface_emit_recording_surface (cairo_ps_surface_t *surface, return status; _cairo_output_stream_printf (surface->stream, " Q\n"); + + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; surface->content = old_content; surface->width = old_width; surface->height = old_height; @@ -2505,12 +2512,16 @@ _cairo_ps_surface_emit_recording_subsurface (cairo_ps_surface_t *surface, cairo_content_t old_content; cairo_rectangle_int_t old_page_bbox; cairo_status_t status; + cairo_surface_clipper_t old_clipper; old_content = surface->content; old_width = surface->width; old_height = surface->height; old_page_bbox = surface->page_bbox; old_cairo_to_ps = surface->cairo_to_ps; + old_clipper = surface->clipper; + _cairo_surface_clipper_init (&surface->clipper, + _cairo_ps_surface_clipper_intersect_clip_path); #if DEBUG_PS _cairo_output_stream_printf (surface->stream, @@ -2553,6 +2564,9 @@ _cairo_ps_surface_emit_recording_subsurface (cairo_ps_surface_t *surface, return status; _cairo_output_stream_printf (surface->stream, " Q\n"); + + _cairo_surface_clipper_reset (&surface->clipper); + surface->clipper = old_clipper; surface->content = old_content; surface->width = old_width; surface->height = old_height; -- 1.7.4.1