diff options
author | Owen Taylor <otaylor@redhat.com> | 2005-02-03 23:29:02 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2005-02-03 23:29:02 +0000 |
commit | 93344f6dfee0d21e5e9aa750b5a91ed10980cd24 (patch) | |
tree | 71978aa4f489edd13c2d71b55344921f0fdaab5b /gdk | |
parent | 8a5d05e253490a5851b7e142f4090971153c1178 (diff) | |
download | gtk+-93344f6dfee0d21e5e9aa750b5a91ed10980cd24.tar.gz |
Add gdk_drawable_set_cairo_target().
2005-02-03 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdrawable.[ch] gdkpixmap.c gdkwindow.c: Add
gdk_drawable_set_cairo_target().
* tests/testtreeflow.c (enum): Use grand not rand as a variable
name because one of the cairo headers is pulling in stdlib.h.
* tests/testcairo.c tests/Makefile.am: Add a simple cairo based
example.
* configure.in: Bump release to 2.7.0, gtk_binary_version to 2.7.0.
* Require libpangocairo for all backends.
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkdraw.c | 23 | ||||
-rw-r--r-- | gdk/gdkdrawable.h | 9 | ||||
-rw-r--r-- | gdk/gdkpixmap.c | 12 | ||||
-rw-r--r-- | gdk/gdkwindow.c | 24 | ||||
-rw-r--r-- | gdk/x11/gdkdrawable-x11.c | 50 | ||||
-rw-r--r-- | gdk/x11/gdkdrawable-x11.h | 1 | ||||
-rw-r--r-- | gdk/x11/gdkpixmap-x11.c | 6 | ||||
-rw-r--r-- | gdk/x11/gdkwindow-x11.c | 11 |
8 files changed, 134 insertions, 2 deletions
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c index f547fad904..63951a024e 100644 --- a/gdk/gdkdraw.c +++ b/gdk/gdkdraw.c @@ -1221,6 +1221,29 @@ gdk_drawable_real_get_visible_region (GdkDrawable *drawable) return gdk_region_rectangle (&rect); } +/** + * gdk_drawable_set_cairo_target: + * @drawable: a #GdkDrawable + * @cr: a cairo context + * + * Sets the given drawable as the target surface for a Cairo context. + * Note that when @drawable is a window and gdk_window_begin_paint() + * has been called, the target surface will be set to the temporary + * backing pixmap, so you can only use the Cairo context until + * the matching call to gdk_window_end_paint(). + * + * Since: 2.10 + **/ +void +gdk_drawable_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr) +{ + g_return_if_fail (GDK_IS_DRAWABLE (drawable)); + g_return_if_fail (cr != NULL); + + return GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_target (drawable, cr); +} + static void composite (guchar *src_buf, gint src_rowstride, diff --git a/gdk/gdkdrawable.h b/gdk/gdkdrawable.h index 3fb9ea846a..612ce694fd 100644 --- a/gdk/gdkdrawable.h +++ b/gdk/gdkdrawable.h @@ -6,6 +6,8 @@ #include <gdk/gdkrgb.h> #include <gdk-pixbuf/gdk-pixbuf.h> +#include <cairo.h> + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -168,8 +170,10 @@ struct _GdkDrawableClass GdkTrapezoid *trapezoids, gint n_trapezoids); + void (*set_cairo_target) (GdkDrawable *drawable, + cairo_t *cr); + /* Padding for future expansion */ - void (*_gdk_reserved3) (void); void (*_gdk_reserved4) (void); void (*_gdk_reserved5) (void); void (*_gdk_reserved6) (void); @@ -388,6 +392,9 @@ GdkImage *gdk_drawable_copy_to_image (GdkDrawable *drawable, GdkRegion *gdk_drawable_get_clip_region (GdkDrawable *drawable); GdkRegion *gdk_drawable_get_visible_region (GdkDrawable *drawable); +void gdk_drawable_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr); + gboolean gdk_draw_rectangle_alpha_libgtk_only (GdkDrawable *drawable, gint x, gint y, diff --git a/gdk/gdkpixmap.c b/gdk/gdkpixmap.c index 978712a9e0..d3012eb64e 100644 --- a/gdk/gdkpixmap.c +++ b/gdk/gdkpixmap.c @@ -144,6 +144,9 @@ static GdkImage* gdk_pixmap_copy_to_image (GdkDrawable *drawable, gint width, gint height); +static void gdk_pixmap_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr); + static GdkVisual* gdk_pixmap_real_get_visual (GdkDrawable *drawable); static gint gdk_pixmap_real_get_depth (GdkDrawable *drawable); static void gdk_pixmap_real_set_colormap (GdkDrawable *drawable, @@ -224,6 +227,7 @@ gdk_pixmap_class_init (GdkPixmapObjectClass *klass) drawable_class->get_colormap = gdk_pixmap_real_get_colormap; drawable_class->get_visual = gdk_pixmap_real_get_visual; drawable_class->_copy_to_image = gdk_pixmap_copy_to_image; + drawable_class->set_cairo_target = gdk_pixmap_set_cairo_target; } static void @@ -517,6 +521,14 @@ gdk_pixmap_copy_to_image (GdkDrawable *drawable, width, height); } +static void +gdk_pixmap_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr) +{ + gdk_drawable_set_cairo_target (((GdkPixmapObject*)drawable)->impl, + cr); +} + static GdkBitmap * make_solid_mask (GdkScreen *screen, gint width, gint height) { diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 41e5e2ab97..4a27988c67 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -157,6 +157,9 @@ static GdkImage* gdk_window_copy_to_image (GdkDrawable *drawable, gint width, gint height); +static void gdk_window_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr); + static void gdk_window_real_get_size (GdkDrawable *drawable, gint *width, gint *height); @@ -263,6 +266,7 @@ gdk_window_class_init (GdkWindowObjectClass *klass) drawable_class->get_colormap = gdk_window_real_get_colormap; drawable_class->get_visual = gdk_window_real_get_visual; drawable_class->_copy_to_image = gdk_window_copy_to_image; + drawable_class->set_cairo_target = gdk_window_set_cairo_target; drawable_class->get_clip_region = gdk_window_get_clip_region; drawable_class->get_visible_region = gdk_window_get_visible_region; drawable_class->get_composite_drawable = gdk_window_get_composite_drawable; @@ -2091,6 +2095,26 @@ gdk_window_copy_to_image (GdkDrawable *drawable, width, height); } +static void +gdk_window_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr) +{ + GdkWindowObject *private = (GdkWindowObject*) drawable; + gint x_offset, y_offset; + + gdk_window_get_offsets (GDK_WINDOW (drawable), &x_offset, &y_offset); + + if (private->paint_stack) + { + GdkWindowPaint *paint = private->paint_stack->data; + gdk_drawable_set_cairo_target (paint->pixmap, cr); + } + else + gdk_drawable_set_cairo_target (private->impl, cr); + + cairo_translate (cr, - x_offset, - y_offset); +} + /* Code for dirty-region queueing */ static GSList *update_windows = NULL; diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index c6f3142072..19c7b9264a 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -147,6 +147,9 @@ static void gdk_x11_draw_trapezoids (GdkDrawable *drawable, GdkTrapezoid *trapezoids, gint n_trapezoids); +static void gdk_x11_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr); + static void gdk_x11_set_colormap (GdkDrawable *drawable, GdkColormap *colormap); @@ -215,6 +218,8 @@ gdk_drawable_impl_x11_class_init (GdkDrawableImplX11Class *klass) drawable_class->draw_pixbuf = gdk_x11_draw_pixbuf; drawable_class->draw_trapezoids = gdk_x11_draw_trapezoids; + drawable_class->set_cairo_target = gdk_x11_set_cairo_target; + drawable_class->set_colormap = gdk_x11_set_colormap; drawable_class->get_colormap = gdk_x11_get_colormap; @@ -1558,6 +1563,51 @@ gdk_x11_draw_trapezoids (GdkDrawable *drawable, g_free (xtrapezoids); } +static cairo_surface_t * +gdk_x11_drawable_get_cairo_surface (GdkDrawable *drawable) +{ + GdkDrawableImplX11 *impl = GDK_DRAWABLE_IMPL_X11 (drawable); + GdkColormap *colormap; + GdkVisual *visual; + + if (GDK_IS_WINDOW_IMPL_X11 (drawable) && + GDK_WINDOW_DESTROYED (impl->wrapper)) + return NULL; + + colormap = gdk_drawable_get_colormap (drawable); + if (!colormap) + { + g_warning ("Using Cairo rendering requires the drawable argument to\n" + "have a specified colormap. All windows have a colormap,\n" + "however, pixmaps only have colormap by default if they\n" + "were created with a non-NULL window argument. Otherwise\n" + "a colormap must be set on them with gdk_drawable_set_colormap"); + return NULL; + } + + visual = gdk_colormap_get_visual (colormap); + + if (!impl->cairo_surface) + { + impl->cairo_surface = cairo_xlib_surface_create (GDK_SCREEN_XDISPLAY (impl->screen), + impl->xid, + GDK_VISUAL_XVISUAL (visual), + CAIRO_FORMAT_RGB24, + GDK_COLORMAP_XCOLORMAP (colormap)); + } + + return impl->cairo_surface; +} + +static void +gdk_x11_set_cairo_target (GdkDrawable *drawable, + cairo_t *cr) +{ + cairo_surface_t *surface = gdk_x11_drawable_get_cairo_surface (drawable); + if (surface) + cairo_set_target_surface (cr, surface); +} + /** * gdk_draw_rectangle_alpha_libgtk_only: * @drawable: The #GdkDrawable to draw on diff --git a/gdk/x11/gdkdrawable-x11.h b/gdk/x11/gdkdrawable-x11.h index 45c8e38b8d..1de1e50c3e 100644 --- a/gdk/x11/gdkdrawable-x11.h +++ b/gdk/x11/gdkdrawable-x11.h @@ -71,6 +71,7 @@ struct _GdkDrawableImplX11 GdkScreen *screen; XftDraw *xft_draw; + cairo_surface_t *cairo_surface; }; struct _GdkDrawableImplX11Class diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index 1b7776fd46..9590aace03 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -135,6 +135,12 @@ gdk_pixmap_impl_x11_finalize (GObject *object) if (draw_impl->xft_draw) XftDrawDestroy (draw_impl->xft_draw); + if (draw_impl->cairo_surface) + { + cairo_surface_destroy (draw_impl->cairo_surface); + draw_impl->cairo_surface = NULL; + } + if (!impl->is_foreign) XFreePixmap (GDK_DISPLAY_XDISPLAY (display), GDK_PIXMAP_XID (wrapper)); } diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index cb2b095ce7..3c86ba9dc0 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -1144,7 +1144,16 @@ _gdk_windowing_window_destroy (GdkWindow *window, draw_impl = GDK_DRAWABLE_IMPL_X11 (private->impl); if (draw_impl->xft_draw) - XftDrawDestroy (draw_impl->xft_draw); + { + XftDrawDestroy (draw_impl->xft_draw); + draw_impl->xft_draw = NULL; + } + + if (draw_impl->cairo_surface) + { + cairo_surface_destroy (draw_impl->cairo_surface); + draw_impl->cairo_surface = NULL; + } if (!recursing && !foreign_destroy) { |