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