[cairo-commit] src/cairo-paginated-surface.c

Chris Wilson ickle at kemper.freedesktop.org
Mon Jul 27 06:05:13 PDT 2009

 src/cairo-paginated-surface.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

New commits:
commit 9f6a0f5668601c74886378d6cdb9588621d30e6d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Jul 27 14:01:32 2009 +0100

    [paginated] Propagate error return during finish.
    In bed2701, I removed the explicit finish of the paginated's target
    surface, since as a wrapper it did not explicitly own the surface and so
    should not be calling finish(). However, we do need to propagate errors
    from the backing surface, such as PDF, which will only be detected during
    the implicit finish in the final destroy. So check to see it we hold the
    last reference to the target (and so our destroy will trigger the implicit
    finish) and call the finish explicitly and check the error status

diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c
index 23443a5..34c4676 100644
--- a/src/cairo-paginated-surface.c
+++ b/src/cairo-paginated-surface.c
@@ -159,6 +159,16 @@ _cairo_paginated_surface_finish (void *abstract_surface)
 	status = cairo_surface_status (abstract_surface);
+     /* XXX We want to propagate any errors from destroy(), but those are not
+      * returned via the api. So we need to explicitly finish the target,
+      * and check the status afterwards. However, we can only call finish()
+      * on the target, if we own it.
+      */
+    if (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->target->ref_count) == 1) {
+	cairo_surface_finish (surface->target);
+	if (status == CAIRO_STATUS_SUCCESS)
+	    status = cairo_surface_status (surface->target);
+    }
     cairo_surface_destroy (surface->target);
     cairo_surface_finish (surface->meta);

More information about the cairo-commit mailing list