]> Pileus Git - ~andy/gtk/blob - gdk/gdkdraw.c
Initial revision
[~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 Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 #include <X11/Xlib.h>
19 #include <X11/Xos.h>
20 #include "gdk.h"
21 #include "gdkprivate.h"
22
23
24 void
25 gdk_draw_point (GdkDrawable *drawable,
26                 GdkGC       *gc,
27                 gint         x,
28                 gint         y)
29 {
30   GdkWindowPrivate *drawable_private;
31   GdkGCPrivate *gc_private;
32
33   g_return_if_fail (drawable != NULL);
34   g_return_if_fail (gc != NULL);
35
36   drawable_private = (GdkWindowPrivate*) drawable;
37   gc_private = (GdkGCPrivate*) gc;
38
39   XDrawPoint (drawable_private->xdisplay, drawable_private->xwindow,
40               gc_private->xgc, x, y);
41 }
42
43 void
44 gdk_draw_line (GdkDrawable *drawable,
45                GdkGC       *gc,
46                gint         x1,
47                gint         y1,
48                gint         x2,
49                gint         y2)
50 {
51   GdkWindowPrivate *drawable_private;
52   GdkGCPrivate *gc_private;
53
54   g_return_if_fail (drawable != NULL);
55   g_return_if_fail (gc != NULL);
56
57   drawable_private = (GdkWindowPrivate*) drawable;
58   gc_private = (GdkGCPrivate*) gc;
59
60   XDrawLine (drawable_private->xdisplay, drawable_private->xwindow,
61              gc_private->xgc, x1, y1, x2, y2);
62 }
63
64 void
65 gdk_draw_rectangle (GdkDrawable *drawable,
66                     GdkGC       *gc,
67                     gint         filled,
68                     gint         x,
69                     gint         y,
70                     gint         width,
71                     gint         height)
72 {
73   GdkWindowPrivate *drawable_private;
74   GdkGCPrivate *gc_private;
75
76   g_return_if_fail (drawable != NULL);
77   g_return_if_fail (gc != NULL);
78
79   drawable_private = (GdkWindowPrivate*) drawable;
80   gc_private = (GdkGCPrivate*) gc;
81
82   if (width == -1)
83     width = drawable_private->width;
84   if (height == -1)
85     height = drawable_private->height;
86
87   if (filled)
88     XFillRectangle (drawable_private->xdisplay, drawable_private->xwindow,
89                     gc_private->xgc, x, y, width, height);
90   else
91     XDrawRectangle (drawable_private->xdisplay, drawable_private->xwindow,
92                     gc_private->xgc, x, y, width, height);
93 }
94
95 void
96 gdk_draw_arc (GdkDrawable *drawable,
97               GdkGC       *gc,
98               gint         filled,
99               gint         x,
100               gint         y,
101               gint         width,
102               gint         height,
103               gint         angle1,
104               gint         angle2)
105 {
106   GdkWindowPrivate *drawable_private;
107   GdkGCPrivate *gc_private;
108
109   g_return_if_fail (drawable != NULL);
110   g_return_if_fail (gc != NULL);
111
112   drawable_private = (GdkWindowPrivate*) drawable;
113   gc_private = (GdkGCPrivate*) gc;
114
115   if (width == -1)
116     width = drawable_private->width;
117   if (height == -1)
118     height = drawable_private->height;
119
120   if (filled)
121     XFillArc (drawable_private->xdisplay, drawable_private->xwindow,
122               gc_private->xgc, x, y, width, height, angle1, angle2);
123   else
124     XDrawArc (drawable_private->xdisplay, drawable_private->xwindow,
125               gc_private->xgc, x, y, width, height, angle1, angle2);
126 }
127
128 void
129 gdk_draw_polygon (GdkDrawable *drawable,
130                   GdkGC       *gc,
131                   gint         filled,
132                   GdkPoint    *points,
133                   gint         npoints)
134 {
135   GdkWindowPrivate *drawable_private;
136   GdkGCPrivate *gc_private;
137
138   g_return_if_fail (drawable != NULL);
139   g_return_if_fail (gc != NULL);
140
141   drawable_private = (GdkWindowPrivate*) drawable;
142   gc_private = (GdkGCPrivate*) gc;
143
144   if (filled)
145     {
146       XFillPolygon (drawable_private->xdisplay, drawable_private->xwindow,
147                     gc_private->xgc, (XPoint*) points, npoints, Complex, CoordModeOrigin);
148     }
149   else
150     {
151       XDrawLines (drawable_private->xdisplay, drawable_private->xwindow,
152                   gc_private->xgc, (XPoint*) points, npoints, CoordModeOrigin);
153
154       if ((points[0].x != points[npoints-1].x) ||
155           (points[0].y != points[npoints-1].y))
156         XDrawLine (drawable_private->xdisplay, drawable_private->xwindow,
157                    gc_private->xgc, points[npoints-1].x, points[npoints-1].y,
158                    points[0].x, points[0].y);
159     }
160 }
161
162 /* gdk_draw_string
163  *
164  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
165  *
166  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
167  */
168 void
169 gdk_draw_string (GdkDrawable *drawable,
170                  GdkFont     *font,
171                  GdkGC       *gc,
172                  gint         x,
173                  gint         y,
174                  const gchar *string)
175 {
176   GdkWindowPrivate *drawable_private;
177   GdkFontPrivate *font_private;
178   GdkGCPrivate *gc_private;
179
180   g_return_if_fail (drawable != NULL);
181   g_return_if_fail (font != NULL);
182   g_return_if_fail (gc != NULL);
183   g_return_if_fail (string != NULL);
184
185   drawable_private = (GdkWindowPrivate*) drawable;
186   gc_private = (GdkGCPrivate*) gc;
187   font_private = (GdkFontPrivate*) font;
188
189   if (font->type == GDK_FONT_FONT)
190     {
191       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
192       XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
193       if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
194         {
195           XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
196                        gc_private->xgc, x, y, string, strlen (string));
197         }
198       else
199         {
200           XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
201                          gc_private->xgc, x, y, (XChar2b *) string,
202                          strlen (string) / 2);
203         }
204     }
205   else if (font->type == GDK_FONT_FONTSET)
206     {
207       XFontSet fontset = (XFontSet) font_private->xfont;
208       XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
209                      fontset, gc_private->xgc, x, y, string, strlen (string));
210     }
211   else
212     g_error("undefined font type\n");
213 }
214
215 /* gdk_draw_text
216  *
217  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
218  *
219  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
220  */
221 void
222 gdk_draw_text (GdkDrawable *drawable,
223                GdkFont     *font,
224                GdkGC       *gc,
225                gint         x,
226                gint         y,
227                const gchar *text,
228                gint         text_length)
229 {
230   GdkWindowPrivate *drawable_private;
231   GdkFontPrivate *font_private;
232   GdkGCPrivate *gc_private;
233
234   g_return_if_fail (drawable != NULL);
235   g_return_if_fail (font != NULL);
236   g_return_if_fail (gc != NULL);
237   g_return_if_fail (text != NULL);
238
239   drawable_private = (GdkWindowPrivate*) drawable;
240   gc_private = (GdkGCPrivate*) gc;
241   font_private = (GdkFontPrivate*) font;
242
243   if (font->type == GDK_FONT_FONT)
244     {
245       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
246       XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
247       if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
248         {
249           XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
250                        gc_private->xgc, x, y, text, text_length);
251         }
252       else
253         {
254           XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
255                          gc_private->xgc, x, y, (XChar2b *) text, text_length / 2);
256         }
257     }
258   else if (font->type == GDK_FONT_FONTSET)
259     {
260       XFontSet fontset = (XFontSet) font_private->xfont;
261       XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
262                      fontset, gc_private->xgc, x, y, text, text_length);
263     }
264   else
265     g_error("undefined font type\n");
266 }
267
268 void
269 gdk_draw_pixmap (GdkDrawable *drawable,
270                  GdkGC       *gc,
271                  GdkPixmap   *src,
272                  gint         xsrc,
273                  gint         ysrc,
274                  gint         xdest,
275                  gint         ydest,
276                  gint         width,
277                  gint         height)
278 {
279   GdkWindowPrivate *drawable_private;
280   GdkWindowPrivate *src_private;
281   GdkGCPrivate *gc_private;
282
283   g_return_if_fail (drawable != NULL);
284   g_return_if_fail (src != NULL);
285   g_return_if_fail (gc != NULL);
286
287   drawable_private = (GdkWindowPrivate*) drawable;
288   src_private = (GdkWindowPrivate*) src;
289   gc_private = (GdkGCPrivate*) gc;
290
291   if (width == -1)
292     width = src_private->width;
293   if (height == -1)
294     height = src_private->height;
295
296   XCopyArea (drawable_private->xdisplay,
297              src_private->xwindow,
298              drawable_private->xwindow,
299              gc_private->xgc,
300              xsrc, ysrc,
301              width, height,
302              xdest, ydest);
303 }
304
305 void
306 gdk_draw_image (GdkDrawable *drawable,
307                 GdkGC       *gc,
308                 GdkImage    *image,
309                 gint         xsrc,
310                 gint         ysrc,
311                 gint         xdest,
312                 gint         ydest,
313                 gint         width,
314                 gint         height)
315 {
316   GdkImagePrivate *image_private;
317
318   g_return_if_fail (drawable != NULL);
319   g_return_if_fail (image != NULL);
320   g_return_if_fail (gc != NULL);
321
322   image_private = (GdkImagePrivate*) image;
323
324   g_return_if_fail (image_private->image_put != NULL);
325
326   if (width == -1)
327     width = image->width;
328   if (height == -1)
329     height = image->height;
330
331   (* image_private->image_put) (drawable, gc, image, xsrc, ysrc,
332                                 xdest, ydest, width, height);
333 }
334
335 void
336 gdk_draw_points (GdkDrawable *drawable,
337                  GdkGC       *gc,
338                  GdkPoint    *points,
339                  gint         npoints)
340 {
341   GdkWindowPrivate *drawable_private;
342   GdkGCPrivate *gc_private;
343
344   g_return_if_fail (drawable != NULL);
345   g_return_if_fail ((points != NULL) && (npoints > 0));
346   g_return_if_fail (gc != NULL);
347
348   drawable_private = (GdkWindowPrivate*) drawable;
349   gc_private = (GdkGCPrivate*) gc;
350
351   XDrawPoints (drawable_private->xdisplay,
352                drawable_private->xwindow,
353                gc_private->xgc,
354                (XPoint *) points,
355                npoints,
356                CoordModeOrigin);
357 }
358
359 void
360 gdk_draw_segments (GdkDrawable *drawable,
361                    GdkGC       *gc,
362                    GdkSegment  *segs,
363                    gint         nsegs)
364 {
365   GdkWindowPrivate *drawable_private;
366   GdkGCPrivate *gc_private;
367
368   if (nsegs <= 0)
369     return;
370
371   g_return_if_fail (drawable != NULL);
372   g_return_if_fail (segs != NULL);
373   g_return_if_fail (gc != NULL);
374
375   drawable_private = (GdkWindowPrivate*) drawable;
376   gc_private = (GdkGCPrivate*) gc;
377
378   XDrawSegments (drawable_private->xdisplay,
379                  drawable_private->xwindow,
380                  gc_private->xgc,
381                  (XSegment *) segs,
382                  nsegs);
383 }