[cairo] Pixmap double buffering in Xlib backend
Keith Packard
keithp at keithp.com
Tue Jul 19 14:49:17 PDT 2005
On Tue, 2005-07-19 at 15:46 -0400, Owen Taylor wrote:
> There is an "philosophical" question here about whether keeping
> a cairo_t around over multiple expose events and drawing to it makes
> sense. The view I've been pushing is that a cairo_t represents the
> state of a single drawing operation, which makes the question of
> how you deal with a changing size for the target of a cairo_t
> irrelevant.
>
> But I don't think we have to have consensus answer to this question.
Right, and the issue here is within a language binding, so you would
force a particular architecture upon all applications using that
binding...
> Even if this function is added, I don't think I'll change that: it
> would be a bit of a pain to do that with the way GDK is organized,
> and I've designed the API to encourage using GdkDrawable rather
> than cairo_surface_t in any case.
Right, I'm not force people to use this model, but rather that it does
have some value.
> But it does indicate to me that a cairo_surface_t that retains its
> identity across changes in the backing Xlib drawable could be
> a desirable thing to have.
>
> On the other hand, the idea of copying state from cairo_t to cairo_t
> really is unattractive. It doesn't allow any abstraction from the
> user of what is going on, since the cairo_t changes. If we really
> wanted to handle it at the cairo_t level, I'd rather restore
> cairo_set_target().
That's why I like the backend-specific patch best of all, as there is a
logical connection between the two pixmaps.
> So, I'm in agreement with the course you suggest of
> cairo_xlib_surface_set_drawable(). Looking at the proposed patch,
>
> +/**
> + * cairo_xlib_surface_set_drawable:
> + * @surface: a #cairo_surface_t for the XLib backend
> + * @drawable: the new drawable for the surface
> + *
> + * Informs cairo of a new X Drawable underlying the
> + * surface. The drawable must match the format
> + * of the surface or the results are undefined
> + **/
>
> Needs to also say that drawable must also match the existing
> display and screen of the surface. I'd make the wording stronger
> by dropping "or the results are undefined", since that sounds
> a bit like the worst that could be expected is misdrawing.
/**
* cairo_xlib_surface_set_drawable:
* @surface: a #cairo_surface_t for the XLib backend
* @drawable: the new drawable for the surface
*
* Informs cairo of a new X Drawable underlying the
* surface. The drawable must match the display, screen
* and format of the existing drawable or the application
* will get X protocol errors and will probably terminate.
* No checks are done by this function to ensure this
* compatibility.
**/
>
> There also may need to be documentation of how this interacts
> with mark_dirty() and flush() once we add those functions,
> but that probably needs to wait until we add them...
Yes, I already noted this
>
> + /* XXX: and what about this case? */
> + if (surface->owns_pixmap)
> + return;
>
> Definitely an error; the user doesn't have sufficient information
> about the results of create_similar() to be able to create a
> new backing drawable for it.
Right, we need to finish the error handling for surface_t so that this
can work correctly.
> The implementation itself looks fine to me.
>
> While I don't think it matters much, I think I'd keep set_size()
> a separate function. It doesn't hurt anything to have it separate,
> it corresponds to the case of drawing to a Window, so why break
> compatibility for no reason.
I have left set_size as a separate function; the reason for including
the size with set_drawable is to avoid weird ordering issues and
potential weird ordering-related issues
(set-size before or aftet set-drawable?)
Without any dissent, I will commit the patch with the updated comment as
shown above in a couple of days.
Thanks for your review, Owen!
-keith
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.freedesktop.org/archives/cairo/attachments/20050719/a7925b84/attachment.pgp
More information about the cairo
mailing list