[cairo] Proposal: cairo_save_state/cairo_restore_state

Behdad Esfahbod behdad at cs.toronto.edu
Mon Jan 23 20:49:23 PST 2006


On Mon, 23 Jan 2006, Carl Worth wrote:

> On Tue, 18 Jan 2005 10:16:01 -0500, Carl Worth wrote:
> >
> > Yes. That's a bug in naming. I think replacing cairo_copy with
> > cairo_current_gstate and cairo_set_gstate should clear this up.
>
> It's interesting to go back sometimes and see how old some ideas are.
>
> Apparently, very close to a year ago I had an idea to eliminate
> cairo_copy and replace it with (what we would call today)
> cairo_get_gstate and cairo_set_gstate.
>
> What happened back then was that we did eliminate cairo_copy. And the
> primary reason for doing so is still valid:
>
>     Copying a cairo_t is not a well-defined or generally useful
>     concept. A cairo_t contains several things that don't make sense
>     to copy generally:
>
> 	the target surface
> 	a stack of graphics "states"
> 	a path[1]

Ah, that's what I was missing when commenting in the bug
report...


> Here's the API that I think is needed:
>
> 	cairo_state_t *
> 	cairo_save_state (cairo_t *cr);
>
> 	void
> 	cairo_restore_state (cairo_t *cr, cairo_state_t *state);
>
> along with the necessary:
>
> 	void
> 	cairo_state_reference (cairo_state_t *state);
>
> 	void
> 	cairo_state_destroy (cairo_state_t *state);
[snip]
> These functions should be _really_ easy to implement. I'll come up
> with a patch soon if nobody beats me to it.

So cairo_state_t is going to be an alias for cairo_gstate_t if I
understand it correctly, right?

Before you get too much into implementation, can I request a
feature?  Make it copy-on-write?  All you need to do is to add a
flag to cairo_state_t stating if it's a saved state.  Then, any
function modifying a cairo_state_t will first check if it's a
saved state, if it is, it will duplicate it first and update the
cario_t.  It probably needs a bit of refactoring since you may
have not the cairo_t around when modifying cairo_state_t, but
this feature makes creating a cairo_t, configuring it (using
saved states) and using it extremely fast.  That was the
intention of the bug reporter at least...

Regards,

--behdad
http://behdad.org/

"Commandment Three says Do Not Kill, Amendment Two says Blood Will Spill"
	-- Dan Bern, "New American Language"


More information about the cairo mailing list