summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2005-02-03 23:29:02 +0000
committerOwen Taylor <otaylor@src.gnome.org>2005-02-03 23:29:02 +0000
commit93344f6dfee0d21e5e9aa750b5a91ed10980cd24 (patch)
tree71978aa4f489edd13c2d71b55344921f0fdaab5b /gdk
parent8a5d05e253490a5851b7e142f4090971153c1178 (diff)
downloadgtk+-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.c23
-rw-r--r--gdk/gdkdrawable.h9
-rw-r--r--gdk/gdkpixmap.c12
-rw-r--r--gdk/gdkwindow.c24
-rw-r--r--gdk/x11/gdkdrawable-x11.c50
-rw-r--r--gdk/x11/gdkdrawable-x11.h1
-rw-r--r--gdk/x11/gdkpixmap-x11.c6
-rw-r--r--gdk/x11/gdkwindow-x11.c11
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)
{