1%h{ 2 #include <gdk/gdk.h> 3%} 4 5%{ 6 #include <gtk/gtk.h> 7 #if GTK_CHECK_VERSION(2,8,0) 8 static cairo_surface_t *ref_cairo_surface(GdkDrawable *self); 9 #endif 10%} 11 12/* Transfers logical drawing commands to a physical (screen) device */ 13/* The default renderer just passes everything through to GDK */ 14/* Since GGobi is an interactive graphics platform, the renderer design 15 is biased towards screen devices. This doesn't preclude, however, 16 off-screen devices that take "snapshots" of GGobi plots */ 17class GGobi:Renderer from Gdk:Drawable 18{ 19 /* everything passes through to this drawable by default */ 20 private GdkDrawable *buffer unrefwith g_object_unref; 21 22 /* buffer should be flushed to this drawable */ 23 private GdkDrawable *parent unrefwith g_object_unref; 24 property OBJECT parent 25 (nick = "out", blurb = "The drawable to which this renderer is flushed", 26 object_type = Gdk:Drawable, flags = CONSTRUCT_ONLY) 27 set { 28 GObject *obj = g_value_dup_object(VAL); 29 if (selfp->parent) 30 g_object_unref(G_OBJECT(selfp->parent)); 31 selfp->parent = GDK_DRAWABLE(obj); 32 if (selfp->buffer) 33 g_object_unref(G_OBJECT(selfp->buffer)); 34 selfp->buffer = self_create_target(self, selfp->parent); 35 } get { 36 g_value_set_object(VAL, selfp->parent); 37 }; 38 39 /* if you already have a special GdkDrawable, and want to make it into a 40 GGobiRenderer, just override this to provide it */ 41 private virtual GdkDrawable * 42 create_target(self, GdkDrawable *parent) 43 { 44 gint width, height; 45 gdk_drawable_get_size(parent, &width, &height); 46 return gdk_pixmap_new(parent, width, height, -1); 47 } 48 49 /* buffers are created by cloning (prototype approach) */ 50 public virtual GGobiRenderer * 51 buffer(self) 52 { 53 GObject *obj = g_object_new(G_OBJECT_TYPE(self), "parent", self, NULL); 54 return GGOBI_RENDERER(obj); 55 } 56 57 public virtual void 58 flush(self, GdkGC *gc, gint xsrc, gint ysrc, gint xdest, gint ydest, 59 gint width, gint height) 60 { 61 gdk_draw_drawable(selfp->parent, gc, selfp->buffer, xsrc, ysrc, xdest, ydest, 62 width, height); 63 } 64 65 /* pass everything through to underlying drawable */ 66 67 override (Gdk:Drawable) void 68 draw_rectangle (GdkDrawable *self, GdkGC *gc, gboolean filled, 69 gint x, gint y, gint width, gint height) 70 { 71 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_rectangle( 72 SELF(self)->_priv->buffer, gc, filled, x, y, width, height); 73 } 74 override (Gdk:Drawable) void 75 draw_arc(GdkDrawable *self, GdkGC *gc, gboolean filled, gint x, gint y, 76 gint width, gint height, gint angle1, gint angle2) 77 { 78 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_arc( 79 SELF(self)->_priv->buffer, gc, filled, x, y, width, height, angle1, angle2); 80 } 81 override (Gdk:Drawable) void 82 draw_polygon(GdkDrawable *self, GdkGC *gc, gboolean filled, 83 GdkPoint *points, gint npoints) 84 { 85 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_polygon( 86 SELF(self)->_priv->buffer, gc, filled, points, npoints); 87 } 88 override (Gdk:Drawable) void 89 draw_points(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) 90 { 91 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_points( 92 SELF(self)->_priv->buffer, gc, points, npoints); 93 } 94 override (Gdk:Drawable) void 95 draw_segments(GdkDrawable *self, GdkGC *gc, GdkSegment *segs, gint nsegs) 96 { 97 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_segments( 98 SELF(self)->_priv->buffer, gc, segs, nsegs); 99 } 100 override (Gdk:Drawable) void 101 draw_lines(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) 102 { 103 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_lines( 104 SELF(self)->_priv->buffer, gc, points, npoints); 105 } 106 override (Gdk:Drawable) void 107 draw_trapezoids(GdkDrawable *self, GdkGC *gc, GdkTrapezoid *trapezoids, 108 gint n_trapezoids) 109 { 110 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_trapezoids( 111 SELF(self)->_priv->buffer, gc, trapezoids, n_trapezoids); 112 } 113 114 override (Gdk:Drawable) void 115 draw_text(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, 116 const gchar *text, gint text_length) 117 { 118 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text( 119 SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); 120 } 121 override (Gdk:Drawable) void 122 draw_text_wc(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, 123 const GdkWChar *text, gint text_length) 124 { 125 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text_wc( 126 SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); 127 } 128 override (Gdk:Drawable) void 129 draw_glyphs(GdkDrawable *self, GdkGC *gc, PangoFont *font, gint x, gint y, 130 PangoGlyphString *glyphs) 131 { 132 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs( 133 SELF(self)->_priv->buffer, gc, font, x, y, glyphs); 134 } 135 override (Gdk:Drawable) void 136 draw_glyphs_transformed(GdkDrawable *self, GdkGC *gc, PangoMatrix *matrix, 137 PangoFont *font, gint x, gint y, PangoGlyphString *glyphs) 138 { 139 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs_transformed( 140 SELF(self)->_priv->buffer, gc, matrix, font, x, y, glyphs); 141 } 142 143 override (Gdk:Drawable) GdkGC * 144 create_gc(GdkDrawable *self, GdkGCValues *values, GdkGCValuesMask mask) 145 { 146 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->create_gc( 147 SELF(self)->_priv->buffer, values, mask); 148 } 149 override (Gdk:Drawable) void 150 draw_drawable(GdkDrawable *self, GdkGC *gc, GdkDrawable *src, gint xsrc, 151 gint ysrc, gint xdest, gint ydest, gint width, gint height) 152 { 153 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_drawable( 154 SELF(self)->_priv->buffer, gc, src, xsrc, ysrc, xdest, ydest, width, height); 155 } 156 override (Gdk:Drawable) void 157 draw_image(GdkDrawable *self, GdkGC *gc, GdkImage *image, gint xsrc, gint ysrc, 158 gint xdest, gint ydest, gint width, gint height) 159 { 160 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_image( 161 SELF(self)->_priv->buffer, gc, image, xsrc, ysrc, xdest, ydest, width, height); 162 } 163 164 override (Gdk:Drawable) gint 165 get_depth(GdkDrawable *self) 166 { 167 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_depth( 168 SELF(self)->_priv->buffer); 169 } 170 override (Gdk:Drawable) void 171 get_size(GdkDrawable *self, gint *width, gint *height) 172 { 173 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_size( 174 SELF(self)->_priv->buffer, width, height); 175 } 176 177 override (Gdk:Drawable) void 178 set_colormap(GdkDrawable *self, GdkColormap *cmap) 179 { 180 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->set_colormap( 181 SELF(self)->_priv->buffer, cmap); 182 } 183 override (Gdk:Drawable) GdkColormap* 184 get_colormap(GdkDrawable *self) 185 { 186 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_colormap( 187 SELF(self)->_priv->buffer); 188 } 189 override (Gdk:Drawable) GdkVisual* 190 get_visual(GdkDrawable *self) 191 { 192 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visual( 193 SELF(self)->_priv->buffer); 194 } 195 override (Gdk:Drawable) GdkScreen* 196 get_screen(GdkDrawable *self) 197 { 198 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_screen( 199 SELF(self)->_priv->buffer); 200 } 201 override (Gdk:Drawable) GdkImage* 202 get_image(GdkDrawable *self, gint x, gint y, gint width, gint height) 203 { 204 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_image( 205 SELF(self)->_priv->buffer, x, y, width, height); 206 } 207 override (Gdk:Drawable) GdkRegion* 208 get_clip_region(GdkDrawable *self) 209 { 210 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_clip_region( 211 SELF(self)->_priv->buffer); 212 } 213 override (Gdk:Drawable) GdkRegion* 214 get_visible_region(GdkDrawable *self) 215 { 216 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visible_region( 217 SELF(self)->_priv->buffer); 218 } 219 override (Gdk:Drawable) GdkDrawable* 220 get_composite_drawable(GdkDrawable *self, gint x, gint y, gint width, 221 gint height, gint *composite_x_offset, gint *composite_y_offset) 222 { 223 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_composite_drawable( 224 SELF(self)->_priv->buffer, x, y, width, height, composite_x_offset, composite_y_offset); 225 } 226 227 override (Gdk:Drawable) void 228 draw_pixbuf(GdkDrawable *self, GdkGC *gc, GdkPixbuf *pixbuf, gint src_x, 229 gint src_y, gint dest_x, gint dest_y, gint width, gint height, 230 GdkRgbDither dither, gint x_dither, gint y_dither) 231 { 232 GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_pixbuf( 233 SELF(self)->_priv->buffer, gc, pixbuf, src_x, src_y, dest_x, dest_y, 234 width, height, dither, x_dither, y_dither); 235 } 236 override (Gdk:Drawable) GdkImage* 237 _copy_to_image(GdkDrawable *self, GdkImage *image, gint src_x, gint src_y, 238 gint dest_x, gint dest_y, gint width, gint height) 239 { 240 return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->_copy_to_image( 241 SELF(self)->_priv->buffer, image, src_x, src_y, dest_x, dest_y, width, height); 242 } 243 244 class_init(self_class) { /* need to do this one manually, to avoid GTK+ 2.8.x dep */ 245 #if GTK_CHECK_VERSION(2,8,0) 246 GDK_DRAWABLE_CLASS(self_class)->ref_cairo_surface = ref_cairo_surface; 247 #endif 248 } 249} 250 251%{ 252 #if GTK_CHECK_VERSION(2,8,0) 253 static cairo_surface_t * 254 ref_cairo_surface(GdkDrawable *self) 255 { 256 return GDK_DRAWABLE_GET_CLASS(GGOBI_RENDERER(self)->_priv->buffer)->ref_cairo_surface( 257 GGOBI_RENDERER(self)->_priv->buffer); 258 } 259 #endif 260%} 261