]> Pileus Git - ~andy/gtk/blob - gdk/gdkdraw.c
Move all X specific code into the x11/ directory. Aside from shuffling
[~andy/gtk] / gdk / gdkdraw.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
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.
8  *
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.
13  *
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.
18  */
19
20 /*
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/. 
25  */
26
27 #include "gdkdrawable.h"
28 #include "gdkprivate.h"
29 #include "gdkwindow.h"
30
31 /* Manipulation of drawables
32  */
33 GdkDrawable *
34 gdk_drawable_alloc (void)
35 {
36   GdkDrawablePrivate *private = g_new (GdkDrawablePrivate, 1);
37   GdkDrawable *drawable = (GdkDrawable*) private;
38   
39   drawable->user_data = NULL;
40
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;
46
47   private->width = 1;
48   private->height = 1;
49
50   private->colormap = NULL;
51
52   return drawable;
53 }
54
55 void          
56 gdk_drawable_set_data (GdkDrawable   *drawable,
57                        const gchar   *key,
58                        gpointer       data,
59                        GDestroyNotify destroy_func)
60 {
61   g_dataset_set_data_full (drawable, key, data, destroy_func);
62 }
63
64 void          
65 gdk_drawable_get_data (GdkDrawable   *drawable,
66                        const gchar   *key)
67 {
68   g_dataset_get_data (drawable, key);
69 }
70
71 GdkDrawableType
72 gdk_drawable_get_type (GdkDrawable *drawable)
73 {
74   g_return_val_if_fail (drawable != NULL, (GdkDrawableType) -1);
75   
76   return GDK_DRAWABLE_TYPE (drawable);
77 }
78
79 void
80 gdk_drawable_get_size (GdkDrawable *drawable,
81                        gint        *width,
82                        gint        *height)
83 {
84   GdkDrawablePrivate *drawable_private;
85   
86   g_return_if_fail (drawable != NULL);
87   
88   drawable_private = (GdkDrawablePrivate*) drawable;
89   
90   if (width)
91     *width = drawable_private->width;
92   if (height)
93     *height = drawable_private->height;
94 }
95
96 GdkVisual*
97 gdk_drawable_get_visual (GdkDrawable *drawable)
98 {
99   GdkColormap *colormap;
100
101   g_return_val_if_fail (drawable != NULL, NULL);
102
103   colormap = gdk_drawable_get_colormap (drawable);
104   return colormap ? gdk_colormap_get_visual (colormap) : NULL;
105 }
106
107 GdkDrawable*
108 gdk_drawable_ref (GdkDrawable *drawable)
109 {
110   GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
111   g_return_val_if_fail (drawable != NULL, NULL);
112   
113   private->ref_count += 1;
114   return drawable;
115 }
116
117 void
118 gdk_drawable_unref (GdkDrawable *drawable)
119 {
120   GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable;
121   
122   g_return_if_fail (drawable != NULL);
123   g_return_if_fail (private->ref_count > 0);
124   
125   private->ref_count -= 1;
126   if (private->ref_count == 0)
127     {
128       private->klass->destroy (drawable);
129       g_dataset_destroy (drawable);
130       g_free (drawable);
131     }
132 }
133
134 /* Drawing
135  */
136 void
137 gdk_draw_point (GdkDrawable *drawable,
138                 GdkGC       *gc,
139                 gint         x,
140                 gint         y)
141 {
142   GdkGCPrivate *gc_private;
143   GdkPoint point;
144
145   g_return_if_fail (drawable != NULL);
146   g_return_if_fail (gc != NULL);
147
148   if (GDK_DRAWABLE_DESTROYED (drawable))
149     return;
150   gc_private = (GdkGCPrivate*) gc;
151
152   point.x = x;
153   point.y = y;
154   
155   ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, &point, 1);
156 }
157
158 void
159 gdk_draw_line (GdkDrawable *drawable,
160                GdkGC       *gc,
161                gint         x1,
162                gint         y1,
163                gint         x2,
164                gint         y2)
165 {
166   GdkGCPrivate *gc_private;
167   GdkSegment segment;
168
169   g_return_if_fail (drawable != NULL);
170   g_return_if_fail (gc != NULL);
171
172   if (GDK_DRAWABLE_DESTROYED (drawable))
173     return;
174   gc_private = (GdkGCPrivate*) gc;
175
176   segment.x1 = x1;
177   segment.y1 = y1;
178   segment.x2 = x2;
179   segment.y2 = y2;
180   ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, &segment, 1);
181 }
182
183 void
184 gdk_draw_rectangle (GdkDrawable *drawable,
185                     GdkGC       *gc,
186                     gint         filled,
187                     gint         x,
188                     gint         y,
189                     gint         width,
190                     gint         height)
191 {
192   GdkDrawablePrivate *drawable_private;
193
194   g_return_if_fail (drawable != NULL);
195   g_return_if_fail (gc != NULL);
196
197   drawable_private = (GdkDrawablePrivate*) drawable;
198   if (GDK_DRAWABLE_DESTROYED (drawable))
199     return;
200
201   if (width < 0)
202     width = drawable_private->width;
203   if (height < 0)
204     height = drawable_private->height;
205
206   ((GdkDrawablePrivate *)drawable)->klass->draw_rectangle (drawable, gc, filled, x, y,
207                                                            width, height);
208 }
209
210 void
211 gdk_draw_arc (GdkDrawable *drawable,
212               GdkGC       *gc,
213               gint         filled,
214               gint         x,
215               gint         y,
216               gint         width,
217               gint         height,
218               gint         angle1,
219               gint         angle2)
220 {
221   GdkDrawablePrivate *drawable_private;
222   GdkGCPrivate *gc_private;
223
224   g_return_if_fail (drawable != NULL);
225   g_return_if_fail (gc != NULL);
226
227   drawable_private = (GdkDrawablePrivate*) drawable;
228   if (GDK_DRAWABLE_DESTROYED (drawable))
229     return;
230   gc_private = (GdkGCPrivate*) gc;
231
232   if (width < 0)
233     width = drawable_private->width;
234   if (height < 0)
235     height = drawable_private->height;
236
237   ((GdkDrawablePrivate *)drawable)->klass->draw_arc (drawable, gc, filled,
238                                                      x, y, width, height, angle1, angle2);
239 }
240
241 void
242 gdk_draw_polygon (GdkDrawable *drawable,
243                   GdkGC       *gc,
244                   gint         filled,
245                   GdkPoint    *points,
246                   gint         npoints)
247 {
248   g_return_if_fail (drawable != NULL);
249   g_return_if_fail (gc != NULL);
250
251   if (GDK_DRAWABLE_DESTROYED (drawable))
252     return;
253
254   ((GdkDrawablePrivate *)drawable)->klass->draw_polygon (drawable, gc, filled,
255                                                          points, npoints);
256 }
257
258 /* gdk_draw_string
259  *
260  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
261  *
262  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
263  */
264 void
265 gdk_draw_string (GdkDrawable *drawable,
266                  GdkFont     *font,
267                  GdkGC       *gc,
268                  gint         x,
269                  gint         y,
270                  const gchar *string)
271 {
272   gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string));
273 }
274
275 /* gdk_draw_text
276  *
277  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
278  *
279  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
280  */
281 void
282 gdk_draw_text (GdkDrawable *drawable,
283                GdkFont     *font,
284                GdkGC       *gc,
285                gint         x,
286                gint         y,
287                const gchar *text,
288                gint         text_length)
289 {
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);
294
295   ((GdkDrawablePrivate *)drawable)->klass->draw_text (drawable, font, gc, x, y, text, text_length);
296 }
297
298 void
299 gdk_draw_text_wc (GdkDrawable    *drawable,
300                   GdkFont        *font,
301                   GdkGC          *gc,
302                   gint            x,
303                   gint            y,
304                   const GdkWChar *text,
305                   gint            text_length)
306 {
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);
311
312   ((GdkDrawablePrivate *)drawable)->klass->draw_text_wc (drawable, font, gc, x, y, text, text_length);
313 }
314
315 void
316 gdk_draw_drawable (GdkDrawable *drawable,
317                    GdkGC       *gc,
318                    GdkDrawable *src,
319                    gint         xsrc,
320                    gint         ysrc,
321                    gint         xdest,
322                    gint         ydest,
323                    gint         width,
324                    gint         height)
325 {
326   g_return_if_fail (drawable != NULL);
327   g_return_if_fail (src != NULL);
328   g_return_if_fail (gc != NULL);
329
330   if (GDK_DRAWABLE_DESTROYED (drawable) || GDK_DRAWABLE_DESTROYED (src))
331     return;
332
333   if (width == -1)
334     width = ((GdkDrawablePrivate *)src)->width;
335   if (height == -1)
336     height = ((GdkDrawablePrivate *)src)->height;
337
338   ((GdkDrawablePrivate *)drawable)->klass->draw_drawable (drawable, gc, src,
339                                                           xsrc, ysrc, xdest, ydest,
340                                                           width, height);
341 }
342
343 void
344 gdk_draw_image (GdkDrawable *drawable,
345                 GdkGC       *gc,
346                 GdkImage    *image,
347                 gint         xsrc,
348                 gint         ysrc,
349                 gint         xdest,
350                 gint         ydest,
351                 gint         width,
352                 gint         height)
353 {
354   GdkImagePrivate *image_private;
355
356   g_return_if_fail (drawable != NULL);
357   g_return_if_fail (image != NULL);
358   g_return_if_fail (gc != NULL);
359
360   image_private = (GdkImagePrivate*) image;
361
362   if (width == -1)
363     width = image->width;
364   if (height == -1)
365     height = image->height;
366
367
368   image_private->klass->image_put (image, drawable, gc, xsrc, ysrc,
369                                    xdest, ydest, width, height);
370 }
371
372 void
373 gdk_draw_points (GdkDrawable *drawable,
374                  GdkGC       *gc,
375                  GdkPoint    *points,
376                  gint         npoints)
377 {
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);
382
383   if (npoints == 0)
384     return;
385
386   if (GDK_DRAWABLE_DESTROYED (drawable))
387     return;
388
389   ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints);
390 }
391
392 void
393 gdk_draw_segments (GdkDrawable *drawable,
394                    GdkGC       *gc,
395                    GdkSegment  *segs,
396                    gint         nsegs)
397 {
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);
402
403   if (nsegs == 0)
404     return;
405
406   if (GDK_DRAWABLE_DESTROYED (drawable))
407     return;
408
409   ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, segs, nsegs);
410 }
411
412 void
413 gdk_draw_lines (GdkDrawable *drawable,
414                 GdkGC       *gc,
415                 GdkPoint    *points,
416                 gint         npoints)
417 {
418
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);
423
424   if (npoints == 0)
425     return;
426
427   if (GDK_DRAWABLE_DESTROYED (drawable))
428     return;
429
430   ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints);
431 }