[cairo] Save cairo_surface_t!
Owen Taylor
otaylor at redhat.com
Thu May 5 15:41:19 PDT 2005
On Thu, 2005-05-05 at 17:29 -0400, Carl Worth wrote:
> To me, that just looks like making things harder than they should
> be. I'm getting more and more tempted by the proposal to eliminate
> cairo_surface_t from the public API, which seems a more complete
> solution than just adding cairo_create convenience functions.
I apologize in advance if this is a rather disproportionate
response to an off-hand idea :-)
While I have some reservations about the idea, which I'll get to
below, I think it's probably a perfectly logically consistent
way to set up a library. But isn't it really late in the game to
make this change?
- It's going to require much significant changes to
every user of cairo than the cairo_create() change.
(Not just mechanical, but structural)
- It's going to require significant changes to every cairo
language binding (cairo_t becomes polymorphic).
- There's not going to be any time to get a lot of experience
with it before we API freeze.
I basically don't see how you could do this without a least a
month of extra time before cairo 1.0. Probably more.
To get to some of my specific reservations:
- The nice thing about the pattern of creating a new cairo_t
is that it naturally goes out of scope in memory managed
languages:
def draw_on_window(window):
cr = window.create_cairo_context()
# draw with cr
Compared to:
def draw_on_window(window):
cr = window.get_cairo_context()
cr.save()
# draw with cr
cr.restore()
[ OK, in non-deterministic GC languages, the first one
needs a cr.finish(), but that's fixable eventually ]
- In general, if you keep cairo_t objects around for the life of a
program, you'll probably be leaking state out of your drawing
functions that you don't mean to leak.
We'd have to promote the idea that you always should
cairo_save() *before* you begin drawing.
- cairo_t adds significant weight over cairo_surface_t when
creating surfaces purely to act as sources. (As will happen
frequently in GTK+)
- The whole idea of source patterns gets really weird.
cairo_set_source_cairo (cairo_t *cr, cairo_t *other_cr);
? And what (if any) parts of other_cr's gstate affect
the source?
- If we ever allow external surface types, the API is going to
be awful, since we will have to export the internal
cairo_surface_t at that point, and backend implementations
will have to supply bits of the cairo_t API and bits of
the cairo_surface_t implementation, which really doesn't
fit standard OO principles.
I probably could keep going, but I'll stop there, since I don't want to
distract from my main point: this is a major change, and isn't going
in the direction that people trying to use cairo need: convergence to a
stable API.
Regards,
Owen
-------------- 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/20050505/6dd9f0d1/attachment.pgp
More information about the cairo
mailing list