[cairo] Idle thoughts on error propagation

Chris Wilson chris at chris-wilson.co.uk
Fri May 9 00:38:14 PDT 2008

On Thu, 2008-05-01 at 15:13 -0700, Carl Worth wrote:
> I can imagine a case where this could be wrong.
> The cairo_t context is conceptually transient for what could be a
> long-standing surface. For example, if I had an application creating a
> new context for the same surface on every expose event, would it be
> correct to force the surface to shutdown due to an error on the
> context?

I think we use surfaces in two entirely different ways and want
different error behaviour for each.

First, we have the long-lived surfaces that, for example, are bound to a
window and thus are used repeatedly as the target of multiple cairo_t.
As this is a destination, we don't care about error propagation and
having to rebuild the surface would be a hindrance (and error-prone).

The second case, we have short-lived surfaces that are used as
intermediate sources. These crucially require error propagation (or a
rigorous handling of errors by the application). However, I think this
could be satisfied by promoting this idiom:

cairo_surface_t *
_construct_source (cairo_surface_t *target)
	cairo_surface_t *surface;
	cairo_t *cr;
	surface = cairo_surface_create_similar (target, CAIRO_CONTENT_COLOUR, width, height);
	cr = cairo_create (surface);
	cairo_surface_destoy (surface);

	_draw_source (cr);

	surface = cairo_surface_reference (cairo_get_target (cr));
	cairo_destroy (cr);

	return surface;

Chris Wilson

More information about the cairo mailing list