static cairo_status_t _cairo_paginated_surface_finish (void *abstract_surface) { cairo_paginated_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; if (! surface->base.is_clear || surface->page_num == 1) { /* Bypass some of the sanity checking in cairo-surface.c, as we * know that the surface is finished... */ status = (cairo_status_t)_cairo_paginated_surface_show_page (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->recording_surface); if (status == CAIRO_STATUS_SUCCESS) status = cairo_surface_status (surface->recording_surface); cairo_surface_destroy (surface->recording_surface); return status; }
static cairo_status_t _cairo_paginated_surface_finish (void *abstract_surface) { cairo_paginated_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; if (surface->page_is_blank == FALSE || surface->page_num == 1) status = _cairo_paginated_surface_show_page (abstract_surface); if (status == CAIRO_STATUS_SUCCESS) { cairo_surface_finish (surface->target); status = cairo_surface_status (surface->target); } if (status == CAIRO_STATUS_SUCCESS) { cairo_surface_finish (surface->meta); status = cairo_surface_status (surface->meta); } cairo_surface_destroy (surface->target); cairo_surface_destroy (surface->meta); return status; }