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.
22 #include "gdkprivate.h"
26 gdk_draw_point (GdkDrawable *drawable,
31 GdkWindowPrivate *drawable_private;
32 GdkGCPrivate *gc_private;
34 g_return_if_fail (drawable != NULL);
35 g_return_if_fail (gc != NULL);
37 drawable_private = (GdkWindowPrivate*) drawable;
38 if (drawable_private->destroyed)
40 gc_private = (GdkGCPrivate*) gc;
42 XDrawPoint (drawable_private->xdisplay, drawable_private->xwindow,
43 gc_private->xgc, x, y);
47 gdk_draw_line (GdkDrawable *drawable,
54 GdkWindowPrivate *drawable_private;
55 GdkGCPrivate *gc_private;
57 g_return_if_fail (drawable != NULL);
58 g_return_if_fail (gc != NULL);
60 drawable_private = (GdkWindowPrivate*) drawable;
61 if (drawable_private->destroyed)
63 gc_private = (GdkGCPrivate*) gc;
65 XDrawLine (drawable_private->xdisplay, drawable_private->xwindow,
66 gc_private->xgc, x1, y1, x2, y2);
70 gdk_draw_rectangle (GdkDrawable *drawable,
78 GdkWindowPrivate *drawable_private;
79 GdkGCPrivate *gc_private;
81 g_return_if_fail (drawable != NULL);
82 g_return_if_fail (gc != NULL);
84 drawable_private = (GdkWindowPrivate*) drawable;
85 if (drawable_private->destroyed)
87 gc_private = (GdkGCPrivate*) gc;
90 width = drawable_private->width;
92 height = drawable_private->height;
95 XFillRectangle (drawable_private->xdisplay, drawable_private->xwindow,
96 gc_private->xgc, x, y, width, height);
98 XDrawRectangle (drawable_private->xdisplay, drawable_private->xwindow,
99 gc_private->xgc, x, y, width, height);
103 gdk_draw_arc (GdkDrawable *drawable,
113 GdkWindowPrivate *drawable_private;
114 GdkGCPrivate *gc_private;
116 g_return_if_fail (drawable != NULL);
117 g_return_if_fail (gc != NULL);
119 drawable_private = (GdkWindowPrivate*) drawable;
120 if (drawable_private->destroyed)
122 gc_private = (GdkGCPrivate*) gc;
125 width = drawable_private->width;
127 height = drawable_private->height;
130 XFillArc (drawable_private->xdisplay, drawable_private->xwindow,
131 gc_private->xgc, x, y, width, height, angle1, angle2);
133 XDrawArc (drawable_private->xdisplay, drawable_private->xwindow,
134 gc_private->xgc, x, y, width, height, angle1, angle2);
138 gdk_draw_polygon (GdkDrawable *drawable,
144 GdkWindowPrivate *drawable_private;
145 GdkGCPrivate *gc_private;
146 GdkPoint *local_points = points;
147 gint local_npoints = npoints;
148 gint local_alloc = 0;
150 g_return_if_fail (drawable != NULL);
151 g_return_if_fail (gc != NULL);
153 drawable_private = (GdkWindowPrivate*) drawable;
154 if (drawable_private->destroyed)
156 gc_private = (GdkGCPrivate*) gc;
160 XFillPolygon (drawable_private->xdisplay, drawable_private->xwindow,
161 gc_private->xgc, (XPoint*) points, npoints, Complex, CoordModeOrigin);
165 if ((points[0].x != points[npoints-1].x) ||
166 (points[0].y != points[npoints-1].y))
170 local_points = (GdkPoint*) g_malloc (local_npoints * sizeof(GdkPoint));
171 memcpy (local_points, points, npoints * sizeof(GdkPoint));
172 local_points[npoints].x = points[0].x;
173 local_points[npoints].y = points[0].y;
176 XDrawLines (drawable_private->xdisplay, drawable_private->xwindow,
178 (XPoint*) local_points, local_npoints,
182 g_free (local_points);
188 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
190 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
193 gdk_draw_string (GdkDrawable *drawable,
200 GdkWindowPrivate *drawable_private;
201 GdkFontPrivate *font_private;
202 GdkGCPrivate *gc_private;
204 g_return_if_fail (drawable != NULL);
205 g_return_if_fail (font != NULL);
206 g_return_if_fail (gc != NULL);
207 g_return_if_fail (string != NULL);
209 drawable_private = (GdkWindowPrivate*) drawable;
210 if (drawable_private->destroyed)
212 gc_private = (GdkGCPrivate*) gc;
213 font_private = (GdkFontPrivate*) font;
215 if (font->type == GDK_FONT_FONT)
217 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
218 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
219 if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
221 XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
222 gc_private->xgc, x, y, string, strlen (string));
226 XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
227 gc_private->xgc, x, y, (XChar2b *) string,
228 strlen (string) / 2);
231 else if (font->type == GDK_FONT_FONTSET)
233 XFontSet fontset = (XFontSet) font_private->xfont;
234 XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
235 fontset, gc_private->xgc, x, y, string, strlen (string));
238 g_error("undefined font type\n");
243 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
245 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
248 gdk_draw_text (GdkDrawable *drawable,
256 GdkWindowPrivate *drawable_private;
257 GdkFontPrivate *font_private;
258 GdkGCPrivate *gc_private;
260 g_return_if_fail (drawable != NULL);
261 g_return_if_fail (font != NULL);
262 g_return_if_fail (gc != NULL);
263 g_return_if_fail (text != NULL);
265 drawable_private = (GdkWindowPrivate*) drawable;
266 if (drawable_private->destroyed)
268 gc_private = (GdkGCPrivate*) gc;
269 font_private = (GdkFontPrivate*) font;
271 if (font->type == GDK_FONT_FONT)
273 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
274 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
275 if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
277 XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
278 gc_private->xgc, x, y, text, text_length);
282 XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
283 gc_private->xgc, x, y, (XChar2b *) text, text_length / 2);
286 else if (font->type == GDK_FONT_FONTSET)
288 XFontSet fontset = (XFontSet) font_private->xfont;
289 XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
290 fontset, gc_private->xgc, x, y, text, text_length);
293 g_error("undefined font type\n");
297 gdk_draw_pixmap (GdkDrawable *drawable,
307 GdkWindowPrivate *drawable_private;
308 GdkWindowPrivate *src_private;
309 GdkGCPrivate *gc_private;
311 g_return_if_fail (drawable != NULL);
312 g_return_if_fail (src != NULL);
313 g_return_if_fail (gc != NULL);
315 drawable_private = (GdkWindowPrivate*) drawable;
316 src_private = (GdkWindowPrivate*) src;
317 if (drawable_private->destroyed || src_private->destroyed)
319 gc_private = (GdkGCPrivate*) gc;
322 width = src_private->width;
324 height = src_private->height;
326 XCopyArea (drawable_private->xdisplay,
327 src_private->xwindow,
328 drawable_private->xwindow,
336 gdk_draw_image (GdkDrawable *drawable,
346 GdkImagePrivate *image_private;
348 g_return_if_fail (drawable != NULL);
349 g_return_if_fail (image != NULL);
350 g_return_if_fail (gc != NULL);
352 image_private = (GdkImagePrivate*) image;
354 g_return_if_fail (image_private->image_put != NULL);
357 width = image->width;
359 height = image->height;
361 (* image_private->image_put) (drawable, gc, image, xsrc, ysrc,
362 xdest, ydest, width, height);
366 gdk_draw_points (GdkDrawable *drawable,
371 GdkWindowPrivate *drawable_private;
372 GdkGCPrivate *gc_private;
374 g_return_if_fail (drawable != NULL);
375 g_return_if_fail ((points != NULL) && (npoints > 0));
376 g_return_if_fail (gc != NULL);
378 drawable_private = (GdkWindowPrivate*) drawable;
379 if (drawable_private->destroyed)
381 gc_private = (GdkGCPrivate*) gc;
383 XDrawPoints (drawable_private->xdisplay,
384 drawable_private->xwindow,
392 gdk_draw_segments (GdkDrawable *drawable,
397 GdkWindowPrivate *drawable_private;
398 GdkGCPrivate *gc_private;
403 g_return_if_fail (drawable != NULL);
404 g_return_if_fail (segs != NULL);
405 g_return_if_fail (gc != NULL);
407 drawable_private = (GdkWindowPrivate*) drawable;
408 if (drawable_private->destroyed)
410 gc_private = (GdkGCPrivate*) gc;
412 XDrawSegments (drawable_private->xdisplay,
413 drawable_private->xwindow,
420 gdk_draw_lines (GdkDrawable *drawable,
425 GdkWindowPrivate *drawable_private;
426 GdkGCPrivate *gc_private;
431 g_return_if_fail (drawable != NULL);
432 g_return_if_fail (points != NULL);
433 g_return_if_fail (gc != NULL);
435 drawable_private = (GdkWindowPrivate*) drawable;
436 gc_private = (GdkGCPrivate*) gc;
438 XDrawLines (drawable_private->xdisplay,
439 drawable_private->xwindow,