[cairo] insufficiency of gdkcairo

Vladimir Vukicevic vladimirv at gmail.com
Thu Jan 19 19:26:41 PST 2006

Owen can probably reply more authoratitively, but AFAIK it's not
possible to fix this without breaking backwards compatability with GTK
2; this will probably only be possible with a backwards compat break
with GTK 3.  The problem is that many gtk programs assume things about
the underlying implementation; that is, they use native X calls when
running under X11, and assume that they can pull out a Drawable/Pixmap
from a GdkPixmap, etc.   I'm pretty sure that the gtk folks want to
get to a mostly-cairo world for any drawing... but it's not possible
to do so right now, so it's happening in incremental steps.

- Vlad

On 1/19/06, Jason Dorje Short <jdorje at users.sf.net> wrote:
> I have several questions about gdk-cairo and cairo<->GTK integration,
> and some comments about why I believe it to be incomplete for programs
> using GTK.
> My first question is about using drawables with an alpha level.  In old
> GTK and X code, a drawable (GdkPixmap or Pixmap) did not have any alpha
> level.  At some point GTK worked its way around this by using
> GdkPixbufs.  Now all of gdk is supposed to be cairo-based.  Does this
> mean a GdkPixmap can have transparency?  You'd think that it would, but
> evidently not.
> (Side note: looking at the GDK 2.8.10 code, I see that GDK is not
> actually cairo-based.  I had assumed that GdkPixmap was just a wrapper
> for cairo_surface_t, so that internally all GDK operations were just
> wrappers for cairo ones.  It would seem to me this is by far the best
> way to do it.  What's actually done is the old method of having
> different types of Pixmaps is still around, and gdkcairo just delves
> into the appropriate backend to get it to create a new cairo_surface_t
> for that pixmap.  This is something I'd say should definitely be
> changed.  With cairo to provide the different backends there is no need
> for GdkPixbuf to have different backends itself!)
> So then we are still stuck with using GdkPixbufs for transparency.  The
> problem here is that there is no way for GdkPixbuf to interact with a
> cairo surface that I can see.  The only way is to make a new
> cairo_surface of whatever type and copy the pixbuf data into it (or vice
> versa).  This is a major problem because the majority of the GTK api is
> based entirely on Pixmaps and Pixbufs, and there is, therefore, *no way*
> to use cairo within GTK to do drawing with transparency.  This means,
> basically, that Cairo is not useful within gtk 2.8, and there is no
> incentive for programs to use it except to be able to access a few toy
> drawing operations.
> So the next question is: what is needed to fix this?
>  From the GTK user's point of view, the basic thing that's needed is for
> GDK to be able to make GdkPixmaps that have alpha levels.  The problem
> with this is two-fold however.  First, all the rest of the GDK API
> assumes that these pixmaps have no alpha, and some may no longer make
> sense with an alpha-supporting Pixmap.  Perhaps a bigger problem is that
> the GDK *backend* also assumes that pixmaps have no alpha, and since the
> GDK backends are not cairo-based this could be a major problem.  Some
> GDK backends may not even support alpha levels; if they were cairo-based
> this could easily be sidestepped by using image surfaces instead but
> since this isn't the case that problem would be insolvable.  The end
> result would be that GdkPixbuf would become obsolete, replaced by
> GdkPixmaps that have alpha support.
> An alternative solution from the user's PoV would be to add direct cairo
> support into the gtk/gdk API.  Then gdkcairo would have to be able to
> create a cairo_surface_t directly (the gdk backend would create one of
> the appropriate type; i.e., gdk-x11 would create a cairo-x11 surface).
> Further, all places in the GTK and GDK apis which currently take a
> Pixmap or Pixbuf (and there are lots of them - like gtk_list_store_set
> or gtk_window_set_icon) would have to have variants that take a
> cairo_surface_t.  This would require much greater API changes (many API
> bits which are currently duplicated for Pixmaps and Pixbufs would become
> triplicated).
>  From a design point of view, the solution is to get rid of the
> different gdkpixmap backends.  All gdkpixmaps should just be cairo
> surfaces, created to be an appropriate type (possibly the only backend
> function needed).  In the long run this would greatly simplify the GDK
> drawing code since it wouldn't have to worry about platform issues at
> all - cairo would do all the work.  However it will take lots of work to
> make this change, and cairo might not actually be up to the task (gdk
> has a linux-fb backend, but I don't think cairo has one).
> -jason
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://cairographics.org/cgi-bin/mailman/listinfo/cairo

More information about the cairo mailing list