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 "gdkinternals.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;
52 private->colormap = NULL;
58 gdk_drawable_set_data (GdkDrawable *drawable,
61 GDestroyNotify destroy_func)
63 g_dataset_set_data_full (drawable, key, data, destroy_func);
67 gdk_drawable_get_data (GdkDrawable *drawable,
70 return g_dataset_get_data (drawable, key);
74 gdk_drawable_get_type (GdkDrawable *drawable)
76 g_return_val_if_fail (drawable != NULL, (GdkDrawableType) -1);
78 return GDK_DRAWABLE_TYPE (drawable);
82 gdk_drawable_get_size (GdkDrawable *drawable,
86 GdkDrawablePrivate *drawable_private;
88 g_return_if_fail (drawable != NULL);
90 drawable_private = (GdkDrawablePrivate*) drawable;
93 *width = drawable_private->width;
95 *height = drawable_private->height;
99 gdk_drawable_get_visual (GdkDrawable *drawable)
101 GdkColormap *colormap;
103 g_return_val_if_fail (drawable != NULL, NULL);
105 colormap = gdk_drawable_get_colormap (drawable);
106 return colormap ? gdk_colormap_get_visual (colormap) : NULL;
110 gdk_drawable_get_depth (GdkDrawable *drawable)
112 GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
113 g_return_val_if_fail (drawable != NULL, 0);
115 return private->depth;
119 gdk_drawable_ref (GdkDrawable *drawable)
121 GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
122 g_return_val_if_fail (drawable != NULL, NULL);
124 private->ref_count += 1;
129 gdk_drawable_unref (GdkDrawable *drawable)
131 GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
133 g_return_if_fail (drawable != NULL);
134 g_return_if_fail (private->ref_count > 0);
136 private->ref_count -= 1;
137 if (private->ref_count == 0)
139 private->klass->destroy (drawable);
140 g_dataset_destroy (drawable);
148 gdk_draw_point (GdkDrawable *drawable,
153 GdkGCPrivate *gc_private;
156 g_return_if_fail (drawable != NULL);
157 g_return_if_fail (gc != NULL);
159 if (GDK_DRAWABLE_DESTROYED (drawable))
161 gc_private = (GdkGCPrivate*) gc;
166 ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, &point, 1);
170 gdk_draw_line (GdkDrawable *drawable,
177 GdkGCPrivate *gc_private;
180 g_return_if_fail (drawable != NULL);
181 g_return_if_fail (gc != NULL);
183 if (GDK_DRAWABLE_DESTROYED (drawable))
185 gc_private = (GdkGCPrivate*) gc;
191 ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, &segment, 1);
195 gdk_draw_rectangle (GdkDrawable *drawable,
203 GdkDrawablePrivate *drawable_private;
205 g_return_if_fail (drawable != NULL);
206 g_return_if_fail (gc != NULL);
208 drawable_private = (GdkDrawablePrivate*) drawable;
209 if (GDK_DRAWABLE_DESTROYED (drawable))
213 width = drawable_private->width;
215 height = drawable_private->height;
217 ((GdkDrawablePrivate *)drawable)->klass->draw_rectangle (drawable, gc, filled, x, y,
222 gdk_draw_arc (GdkDrawable *drawable,
232 GdkDrawablePrivate *drawable_private;
233 GdkGCPrivate *gc_private;
235 g_return_if_fail (drawable != NULL);
236 g_return_if_fail (gc != NULL);
238 drawable_private = (GdkDrawablePrivate*) drawable;
239 if (GDK_DRAWABLE_DESTROYED (drawable))
241 gc_private = (GdkGCPrivate*) gc;
244 width = drawable_private->width;
246 height = drawable_private->height;
248 ((GdkDrawablePrivate *)drawable)->klass->draw_arc (drawable, gc, filled,
249 x, y, width, height, angle1, angle2);
253 gdk_draw_polygon (GdkDrawable *drawable,
259 g_return_if_fail (drawable != NULL);
260 g_return_if_fail (gc != NULL);
262 if (GDK_DRAWABLE_DESTROYED (drawable))
265 ((GdkDrawablePrivate *)drawable)->klass->draw_polygon (drawable, gc, filled,
271 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
273 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
276 gdk_draw_string (GdkDrawable *drawable,
283 gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string));
288 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
290 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
293 gdk_draw_text (GdkDrawable *drawable,
301 g_return_if_fail (drawable != NULL);
302 g_return_if_fail (font != NULL);
303 g_return_if_fail (gc != NULL);
304 g_return_if_fail (text != NULL);
306 ((GdkDrawablePrivate *)drawable)->klass->draw_text (drawable, font, gc, x, y, text, text_length);
310 gdk_draw_text_wc (GdkDrawable *drawable,
315 const GdkWChar *text,
318 g_return_if_fail (drawable != NULL);
319 g_return_if_fail (font != NULL);
320 g_return_if_fail (gc != NULL);
321 g_return_if_fail (text != NULL);
323 ((GdkDrawablePrivate *)drawable)->klass->draw_text_wc (drawable, font, gc, x, y, text, text_length);
327 gdk_draw_drawable (GdkDrawable *drawable,
337 g_return_if_fail (drawable != NULL);
338 g_return_if_fail (src != NULL);
339 g_return_if_fail (gc != NULL);
341 if (GDK_DRAWABLE_DESTROYED (drawable) || GDK_DRAWABLE_DESTROYED (src))
345 width = ((GdkDrawablePrivate *)src)->width;
347 height = ((GdkDrawablePrivate *)src)->height;
349 ((GdkDrawablePrivate *)drawable)->klass->draw_drawable (drawable, gc, src,
350 xsrc, ysrc, xdest, ydest,
355 gdk_draw_image (GdkDrawable *drawable,
365 GdkImagePrivate *image_private;
367 g_return_if_fail (drawable != NULL);
368 g_return_if_fail (image != NULL);
369 g_return_if_fail (gc != NULL);
371 image_private = (GdkImagePrivate*) image;
374 width = image->width;
376 height = image->height;
379 if (GDK_IS_WINDOW (drawable))
380 _gdk_window_draw_image (drawable, gc, image, xsrc, ysrc,
381 xdest, ydest, width, height);
383 image_private->klass->image_put (image, drawable, gc, xsrc, ysrc,
384 xdest, ydest, width, height);
388 gdk_draw_points (GdkDrawable *drawable,
393 g_return_if_fail (drawable != NULL);
394 g_return_if_fail ((points != NULL) && (npoints > 0));
395 g_return_if_fail (gc != NULL);
396 g_return_if_fail (npoints >= 0);
401 if (GDK_DRAWABLE_DESTROYED (drawable))
404 ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints);
408 gdk_draw_segments (GdkDrawable *drawable,
413 g_return_if_fail (drawable != NULL);
418 g_return_if_fail (segs != NULL);
419 g_return_if_fail (gc != NULL);
420 g_return_if_fail (nsegs >= 0);
422 if (GDK_DRAWABLE_DESTROYED (drawable))
425 ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, segs, nsegs);
429 gdk_draw_lines (GdkDrawable *drawable,
435 g_return_if_fail (drawable != NULL);
436 g_return_if_fail (points != NULL);
437 g_return_if_fail (gc != NULL);
438 g_return_if_fail (npoints >= 0);
443 if (GDK_DRAWABLE_DESTROYED (drawable))
446 ((GdkDrawablePrivate *)drawable)->klass->draw_lines (drawable, gc, points, npoints);