[cairo] cairo reset

Mike Emmel mike.emmel at gmail.com
Fri Sep 22 10:25:06 PDT 2006


Maybe for me the biggest grip is when the path is not valid.

I think the answer is that CAIRO_STATUS_NO_CURRENT_POINT
should not be fatal but the return value for the functions that cause it.
Since they can always catch it and set a current point.
Or fix the current point bug I mentioned to return this
and the user can ensure the path is valid.

The real world case is generally you can have a lot of different code
adding to the
current path without knowing what the current path is.

I think its simpler to always have the moveto 0 0 in the base state.
And the only place where you get a NO_CURRENT_POINT is in
the get_current_point call if the user has never set path data.
Then we never have this error. Note initializing the path to 0 0
simply leads to
problems IMHO.


On 9/22/06, Carl Worth <cworth at cworth.org> wrote:
> On Fri, 22 Sep 2006 02:09:02 -0700 (PDT), Kevin Brooks wrote:
> > I want to know if there is something like
> > "cairo_reset(cairo_t*)" function to "reset" cairo
> > context or it must be destroyed and created to start
> > over again.
>
> What state are you looking to reset exactly?
>
> Currently, within the cairo_t there are a few different things that
> you might mean when saying "reset":
>
> The path:               Can be reset with:
>
>                         cairo_new_path (cr);
>
> The target surface:     Can be cleared to 0 in all channels with:
>
>                         cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
>                         cairo_paint (cr);
>
> The graphics state:     This includes the current transformation matrix,
>                         line stroking parameters, source pattern,
>                         etc. Basically any state that can be set in
>                         the cairo_t context aside from the path and
>                         the contents of the everything but the path.
>
>                         There is not currently a call to reset the
>                         graphics state to its defaults, but one can
>                         reset it to any state which was previously
>                         saved with cairo_save(). So, for example:
>
>                         cairo_save (cr); /* Save graphics state */
>                         ... /* draw stuff */ ...
>                         cairo_restore (cr); /* Restore saved state */
>
> The error status:       Initially the status has the non-error value
>                         of CAIRO_STATUS_SUCCESS. Once an error is set
>                         in the cairo_t context there is no way to
>                         reset that error, and the only thing that can
>                         be done with the context is to cairo_destroy
>                         it.
>
> So there are two places where I mentioned above that there is no
> available "reset". The first is the graphics state. We could add a way
> to set the graphics state to all-default values if someone found that
> very interesting. But I'm not sure that the default state is really
> all that interesting---it has some fairly arbitrary things in it,
> (such as an opaque black source pattern). One part of the default
> graphics state that is often interesting is an identity
> transformation matrix, and that can be set at any time with
> cairo_identity_matrix().
>
> The other state that cannot be reset is the error status. The
> rationale for not making this recoverable is that we don't have any
> guarantee that we can restore the context to any particular state
> after an error occurs. Without a huge audit and a lot of pain to make
> every cairo operation atomic, the only conceivable state to restore to
> would be the default state. And if we had an operation that did
> recover-error-and-return-context-to-default-state then I would argue
> that that wouldn't achieve anything that cairo_destroy;cairo_create
> does not also achieve, but that it could lead to confusion as people
> might not expect all of the state to be reset when recovering from
> errors.
>
> If people can share real-world examples of where the above strategies
> have lead to pain, I would love to hear about them so that we can
> reconsider and fix things as needed.
>
> Thanks,
>
> -Carl
>
>
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://cairographics.org/cgi-bin/mailman/listinfo/cairo
>
>
>


More information about the cairo mailing list