1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #include "gdkdrawable.h"
28 #include "gdkprivate.h"
29 #include "gdkwindow.h"
31 /* Manipulation of drawables
34 gdk_drawable_alloc (void)
36 GdkDrawablePrivate *private = g_new (GdkDrawablePrivate, 1);
37 GdkDrawable *drawable = (GdkDrawable*) private;
39 drawable->user_data = NULL;
41 private->ref_count = 1;
42 private->destroyed = FALSE;
43 private->klass = NULL;
44 private->klass_data = NULL;
45 private->window_type = GDK_WINDOW_CHILD;
50 private->colormap = NULL;
56 gdk_drawable_set_data (GdkDrawable *drawable,
59 GDestroyNotify destroy_func)
61 g_dataset_set_data_full (drawable, key, data, destroy_func);
65 gdk_drawable_get_data (GdkDrawable *drawable,
68 g_dataset_get_data (drawable, key);
72 gdk_drawable_get_type (GdkDrawable *drawable)
74 g_return_val_if_fail (drawable != NULL, (GdkDrawableType) -1);
76 return GDK_DRAWABLE_TYPE (drawable);
80 gdk_drawable_get_size (GdkDrawable *drawable,
84 GdkDrawablePrivate *drawable_private;
86 g_return_if_fail (drawable != NULL);
88 drawable_private = (GdkDrawablePrivate*) drawable;
91 *width = drawable_private->width;
93 *height = drawable_private->height;
97 gdk_drawable_get_visual (GdkDrawable *drawable)
99 GdkColormap *colormap;
101 g_return_val_if_fail (drawable != NULL, NULL);
103 colormap = gdk_drawable_get_colormap (drawable);
104 return colormap ? gdk_colormap_get_visual (colormap) : NULL;
108 gdk_drawable_ref (GdkDrawable *drawable)
110 GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
111 g_return_val_if_fail (drawable != NULL, NULL);
113 private->ref_count += 1;
118 gdk_drawable_unref (GdkDrawable *drawable)
120 GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
122 g_return_if_fail (drawable != NULL);
123 g_return_if_fail (private->ref_count > 0);
125 private->ref_count -= 1;
126 if (private->ref_count == 0)
128 private->klass->destroy (drawable);
129 g_dataset_destroy (drawable);
137 gdk_draw_point (GdkDrawable *drawable,
142 GdkGCPrivate *gc_private;
145 g_return_if_fail (drawable != NULL);
146 g_return_if_fail (gc != NULL);
148 if (GDK_DRAWABLE_DESTROYED (drawable))
150 gc_private = (GdkGCPrivate*) gc;
155 ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, &point, 1);
159 gdk_draw_line (GdkDrawable *drawable,
166 GdkGCPrivate *gc_private;
169 g_return_if_fail (drawable != NULL);
170 g_return_if_fail (gc != NULL);
172 if (GDK_DRAWABLE_DESTROYED (drawable))
174 gc_private = (GdkGCPrivate*) gc;
180 ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, &segment, 1);
184 gdk_draw_rectangle (GdkDrawable *drawable,
192 GdkDrawablePrivate *drawable_private;
194 g_return_if_fail (drawable != NULL);
195 g_return_if_fail (gc != NULL);
197 drawable_private = (GdkDrawablePrivate*) drawable;
198 if (GDK_DRAWABLE_DESTROYED (drawable))
202 width = drawable_private->width;
204 height = drawable_private->height;
206 ((GdkDrawablePrivate *)drawable)->klass->draw_rectangle (drawable, gc, filled, x, y,
211 gdk_draw_arc (GdkDrawable *drawable,
221 GdkDrawablePrivate *drawable_private;
222 GdkGCPrivate *gc_private;
224 g_return_if_fail (drawable != NULL);
225 g_return_if_fail (gc != NULL);
227 drawable_private = (GdkDrawablePrivate*) drawable;
228 if (GDK_DRAWABLE_DESTROYED (drawable))
230 gc_private = (GdkGCPrivate*) gc;
233 width = drawable_private->width;
235 height = drawable_private->height;
237 ((GdkDrawablePrivate *)drawable)->klass->draw_arc (drawable, gc, filled,
238 x, y, width, height, angle1, angle2);
242 gdk_draw_polygon (GdkDrawable *drawable,
248 g_return_if_fail (drawable != NULL);
249 g_return_if_fail (gc != NULL);
251 if (GDK_DRAWABLE_DESTROYED (drawable))
254 ((GdkDrawablePrivate *)drawable)->klass->draw_polygon (drawable, gc, filled,
260 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
262 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
265 gdk_draw_string (GdkDrawable *drawable,
272 gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string));
277 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
279 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
282 gdk_draw_text (GdkDrawable *drawable,
290 g_return_if_fail (drawable != NULL);
291 g_return_if_fail (font != NULL);
292 g_return_if_fail (gc != NULL);
293 g_return_if_fail (text != NULL);
295 ((GdkDrawablePrivate *)drawable)->klass->draw_text (drawable, font, gc, x, y, text, text_length);
299 gdk_draw_text_wc (GdkDrawable *drawable,
304 const GdkWChar *text,
307 g_return_if_fail (drawable != NULL);
308 g_return_if_fail (font != NULL);
309 g_return_if_fail (gc != NULL);
310 g_return_if_fail (text != NULL);
312 ((GdkDrawablePrivate *)drawable)->klass->draw_text_wc (drawable, font, gc, x, y, text, text_length);
316 gdk_draw_drawable (GdkDrawable *drawable,
326 g_return_if_fail (drawable != NULL);
327 g_return_if_fail (src != NULL);
328 g_return_if_fail (gc != NULL);
330 if (GDK_DRAWABLE_DESTROYED (drawable) || GDK_DRAWABLE_DESTROYED (src))
334 width = ((GdkDrawablePrivate *)src)->width;
336 height = ((GdkDrawablePrivate *)src)->height;
338 ((GdkDrawablePrivate *)drawable)->klass->draw_drawable (drawable, gc, src,
339 xsrc, ysrc, xdest, ydest,
344 gdk_draw_image (GdkDrawable *drawable,
354 GdkImagePrivate *image_private;
356 g_return_if_fail (drawable != NULL);
357 g_return_if_fail (image != NULL);
358 g_return_if_fail (gc != NULL);
360 image_private = (GdkImagePrivate*) image;
363 width = image->width;
365 height = image->height;
368 image_private->klass->image_put (image, drawable, gc, xsrc, ysrc,
369 xdest, ydest, width, height);
373 gdk_draw_points (GdkDrawable *drawable,
378 g_return_if_fail (drawable != NULL);
379 g_return_if_fail ((points != NULL) && (npoints > 0));
380 g_return_if_fail (gc != NULL);
381 g_return_if_fail (npoints >= 0);
386 if (GDK_DRAWABLE_DESTROYED (drawable))
389 ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints);
393 gdk_draw_segments (GdkDrawable *drawable,
398 g_return_if_fail (drawable != NULL);
399 g_return_if_fail (segs != NULL);
400 g_return_if_fail (gc != NULL);
401 g_return_if_fail (nsegs >= 0);
406 if (GDK_DRAWABLE_DESTROYED (drawable))
409 ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, segs, nsegs);
413 gdk_draw_lines (GdkDrawable *drawable,
419 g_return_if_fail (drawable != NULL);
420 g_return_if_fail (points != NULL);
421 g_return_if_fail (gc != NULL);
422 g_return_if_fail (npoints >= 0);
427 if (GDK_DRAWABLE_DESTROYED (drawable))
430 ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints);