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 Lesser 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 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser 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-2000. 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 static GdkDrawable* gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
36 gint *composite_x_offset,
37 gint *composite_y_offset);
39 static void gdk_drawable_class_init (GdkDrawableClass *klass);
42 gdk_drawable_get_type (void)
44 static GType object_type = 0;
48 static const GTypeInfo object_info =
50 sizeof (GdkDrawableClass),
52 (GBaseFinalizeFunc) NULL,
53 (GClassInitFunc) gdk_drawable_class_init,
54 NULL, /* class_finalize */
55 NULL, /* class_data */
58 (GInstanceInitFunc) NULL,
61 object_type = g_type_register_static (G_TYPE_OBJECT,
70 gdk_drawable_class_init (GdkDrawableClass *klass)
72 klass->get_composite_drawable = gdk_drawable_real_get_composite_drawable;
75 /* Manipulation of drawables
79 gdk_drawable_set_data (GdkDrawable *drawable,
82 GDestroyNotify destroy_func)
84 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
86 g_object_set_qdata_full (G_OBJECT (drawable),
87 g_quark_from_string (key),
93 gdk_drawable_get_data (GdkDrawable *drawable,
96 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
98 return g_object_get_qdata (G_OBJECT (drawable),
99 g_quark_try_string (key));
103 gdk_drawable_get_size (GdkDrawable *drawable,
107 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
109 GDK_DRAWABLE_GET_CLASS (drawable)->get_size (drawable, width, height);
113 gdk_drawable_get_visual (GdkDrawable *drawable)
115 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
117 return GDK_DRAWABLE_GET_CLASS (drawable)->get_visual (drawable);
121 gdk_drawable_get_depth (GdkDrawable *drawable)
123 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), 0);
125 return GDK_DRAWABLE_GET_CLASS (drawable)->get_depth (drawable);
129 gdk_drawable_set_colormap (GdkDrawable *drawable,
132 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
134 GDK_DRAWABLE_GET_CLASS (drawable)->set_colormap (drawable, cmap);
138 gdk_drawable_get_colormap (GdkDrawable *drawable)
140 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
142 return GDK_DRAWABLE_GET_CLASS (drawable)->get_colormap (drawable);
146 gdk_drawable_ref (GdkDrawable *drawable)
148 return (GdkDrawable *) g_object_ref (G_OBJECT (drawable));
152 gdk_drawable_unref (GdkDrawable *drawable)
154 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
156 g_object_unref (G_OBJECT (drawable));
162 gdk_draw_point (GdkDrawable *drawable,
169 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
170 g_return_if_fail (GDK_IS_GC (gc));
175 GDK_DRAWABLE_GET_CLASS (drawable)->draw_points (drawable, gc, &point, 1);
179 gdk_draw_line (GdkDrawable *drawable,
188 g_return_if_fail (drawable != NULL);
189 g_return_if_fail (gc != NULL);
190 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
191 g_return_if_fail (GDK_IS_GC (gc));
197 GDK_DRAWABLE_GET_CLASS (drawable)->draw_segments (drawable, gc, &segment, 1);
201 gdk_draw_rectangle (GdkDrawable *drawable,
209 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
210 g_return_if_fail (GDK_IS_GC (gc));
212 if (width < 0 || height < 0)
217 gdk_drawable_get_size (drawable, &real_width, &real_height);
222 height = real_height;
225 GDK_DRAWABLE_GET_CLASS (drawable)->draw_rectangle (drawable, gc, filled, x, y,
230 gdk_draw_arc (GdkDrawable *drawable,
240 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
241 g_return_if_fail (GDK_IS_GC (gc));
243 if (width < 0 || height < 0)
248 gdk_drawable_get_size (drawable, &real_width, &real_height);
253 height = real_height;
256 GDK_DRAWABLE_GET_CLASS (drawable)->draw_arc (drawable, gc, filled,
257 x, y, width, height, angle1, angle2);
261 gdk_draw_polygon (GdkDrawable *drawable,
267 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
268 g_return_if_fail (GDK_IS_GC (gc));
270 GDK_DRAWABLE_GET_CLASS (drawable)->draw_polygon (drawable, gc, filled,
276 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
278 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
281 gdk_draw_string (GdkDrawable *drawable,
288 gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string));
293 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
295 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
298 gdk_draw_text (GdkDrawable *drawable,
306 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
307 g_return_if_fail (font != NULL);
308 g_return_if_fail (GDK_IS_GC (gc));
309 g_return_if_fail (text != NULL);
311 GDK_DRAWABLE_GET_CLASS (drawable)->draw_text (drawable, font, gc, x, y, text, text_length);
315 gdk_draw_text_wc (GdkDrawable *drawable,
320 const GdkWChar *text,
323 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
324 g_return_if_fail (font != NULL);
325 g_return_if_fail (GDK_IS_GC (gc));
326 g_return_if_fail (text != NULL);
328 GDK_DRAWABLE_GET_CLASS (drawable)->draw_text_wc (drawable, font, gc, x, y, text, text_length);
332 gdk_draw_drawable (GdkDrawable *drawable,
342 GdkDrawable *composite;
343 gint composite_x_offset = 0;
344 gint composite_y_offset = 0;
346 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
347 g_return_if_fail (src != NULL);
348 g_return_if_fail (GDK_IS_GC (gc));
350 if (width < 0 || height < 0)
355 gdk_drawable_get_size (src, &real_width, &real_height);
360 height = real_height;
365 GDK_DRAWABLE_GET_CLASS (src)->get_composite_drawable (src,
369 &composite_y_offset);
372 GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc, composite,
373 xsrc - composite_x_offset,
374 ysrc - composite_y_offset,
378 g_object_unref (G_OBJECT (composite));
382 gdk_draw_image (GdkDrawable *drawable,
392 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
393 g_return_if_fail (image != NULL);
394 g_return_if_fail (GDK_IS_GC (gc));
397 width = image->width;
399 height = image->height;
401 GDK_DRAWABLE_GET_CLASS (drawable)->draw_image (drawable, gc, image, xsrc, ysrc,
402 xdest, ydest, width, height);
406 gdk_draw_points (GdkDrawable *drawable,
411 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
412 g_return_if_fail ((points != NULL) && (npoints > 0));
413 g_return_if_fail (GDK_IS_GC (gc));
414 g_return_if_fail (npoints >= 0);
419 GDK_DRAWABLE_GET_CLASS (drawable)->draw_points (drawable, gc, points, npoints);
423 gdk_draw_segments (GdkDrawable *drawable,
428 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
433 g_return_if_fail (segs != NULL);
434 g_return_if_fail (GDK_IS_GC (gc));
435 g_return_if_fail (nsegs >= 0);
437 GDK_DRAWABLE_GET_CLASS (drawable)->draw_segments (drawable, gc, segs, nsegs);
441 gdk_draw_lines (GdkDrawable *drawable,
447 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
448 g_return_if_fail (points != NULL);
449 g_return_if_fail (GDK_IS_GC (gc));
450 g_return_if_fail (npoints >= 0);
455 GDK_DRAWABLE_GET_CLASS (drawable)->draw_lines (drawable, gc, points, npoints);
459 gdk_draw_glyphs (GdkDrawable *drawable,
464 PangoGlyphString *glyphs)
466 g_return_if_fail (GDK_IS_DRAWABLE (drawable));
467 g_return_if_fail (GDK_IS_GC (gc));
470 GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs (drawable, gc, font, x, y, glyphs);
475 gdk_drawable_get_image (GdkDrawable *drawable,
481 GdkDrawable *composite;
482 gint composite_x_offset = 0;
483 gint composite_y_offset = 0;
486 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
487 g_return_val_if_fail (x >= 0, NULL);
488 g_return_val_if_fail (y >= 0, NULL);
489 g_return_val_if_fail (width >= 0, NULL);
490 g_return_val_if_fail (height >= 0, NULL);
493 GDK_DRAWABLE_GET_CLASS (drawable)->get_composite_drawable (drawable,
497 &composite_y_offset);
499 retval = GDK_DRAWABLE_GET_CLASS (composite)->get_image (composite,
500 x - composite_x_offset,
501 y - composite_y_offset,
504 g_object_unref (G_OBJECT (composite));
510 gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
515 gint *composite_x_offset,
516 gint *composite_y_offset)
518 g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
520 *composite_x_offset = 0;
521 *composite_y_offset = 0;
523 return GDK_DRAWABLE (g_object_ref (G_OBJECT (drawable)));