From ed87ddddb3994f126e0f2d18fa23da6bc5ed579e Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Sat, 20 Nov 2010 00:50:04 +1030 Subject: [PATCH] PS/PDF: Fix regression when changing page size to a larger size https://bugs.freedesktop.org/show_bug.cgi?id=24691 (cherry picked from commit e7c5f470436220668e50201d775a9fec47162a67) --- src/cairo-paginated-surface.c | 28 ++++++++++++++++++++++++++++ src/cairo-pdf-surface.c | 10 ++++++++-- src/cairo-ps-surface.c | 6 ++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c index af4790e7e..9e65f7ba0 100644 --- a/src/cairo-paginated-surface.c +++ b/src/cairo-paginated-surface.c @@ -151,6 +151,34 @@ _cairo_paginated_surface_get_target (cairo_surface_t *surface) return paginated_surface->target; } +cairo_status_t +_cairo_paginated_surface_set_size (cairo_surface_t *surface, + int width, + int height) +{ + cairo_paginated_surface_t *paginated_surface; + cairo_status_t status; + cairo_rectangle_t recording_extents; + + assert (_cairo_surface_is_paginated (surface)); + + paginated_surface = (cairo_paginated_surface_t *) surface; + + recording_extents.x = 0; + recording_extents.y = 0; + recording_extents.width = width; + recording_extents.height = height; + + cairo_surface_destroy (paginated_surface->recording_surface); + paginated_surface->recording_surface = cairo_recording_surface_create (paginated_surface->content, + &recording_extents); + status = paginated_surface->recording_surface->status; + if (unlikely (status)) + return _cairo_surface_set_error (surface, status); + + return CAIRO_STATUS_SUCCESS; +} + static cairo_status_t _cairo_paginated_surface_finish (void *abstract_surface) { diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index ae2e4f544..0f4171373 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -645,6 +645,7 @@ cairo_pdf_surface_set_size (cairo_surface_t *surface, double height_in_points) { cairo_pdf_surface_t *pdf_surface = NULL; /* hide compiler warning */ + cairo_status_t status; if (! _extract_pdf_surface (surface, &pdf_surface)) return; @@ -652,6 +653,11 @@ cairo_pdf_surface_set_size (cairo_surface_t *surface, _cairo_pdf_surface_set_size_internal (pdf_surface, width_in_points, height_in_points); + status = _cairo_paginated_surface_set_size (pdf_surface->paginated_surface, + width_in_points, + height_in_points); + if (status) + status = _cairo_surface_set_error (surface, status); } static void @@ -1720,8 +1726,6 @@ _cairo_pdf_surface_finish (void *abstract_surface) surface->font_subsets = NULL; } - _cairo_surface_clipper_reset (&surface->clipper); - return status; } @@ -3571,6 +3575,8 @@ _cairo_pdf_surface_show_page (void *abstract_surface) if (unlikely (status)) return status; + _cairo_surface_clipper_reset (&surface->clipper); + status = _cairo_pdf_surface_write_page (surface); if (unlikely (status)) return status; diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c index c73214e00..1c2edbe52 100644 --- a/src/cairo-ps-surface.c +++ b/src/cairo-ps-surface.c @@ -1303,6 +1303,7 @@ cairo_ps_surface_set_size (cairo_surface_t *surface, double height_in_points) { cairo_ps_surface_t *ps_surface = NULL; + cairo_status_t status; if (! _extract_ps_surface (surface, TRUE, &ps_surface)) return; @@ -1312,6 +1313,11 @@ cairo_ps_surface_set_size (cairo_surface_t *surface, cairo_matrix_init (&ps_surface->cairo_to_ps, 1, 0, 0, -1, 0, height_in_points); _cairo_pdf_operators_set_cairo_to_pdf_matrix (&ps_surface->pdf_operators, &ps_surface->cairo_to_ps); + status = _cairo_paginated_surface_set_size (ps_surface->paginated_surface, + width_in_points, + height_in_points); + if (status) + status = _cairo_surface_set_error (surface, status); } /**