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/.
30 #include "gdkprivate.h"
34 gdk_draw_point (GdkDrawable *drawable,
39 GdkWindowPrivate *drawable_private;
40 GdkGCPrivate *gc_private;
42 g_return_if_fail (drawable != NULL);
43 g_return_if_fail (gc != NULL);
45 drawable_private = (GdkWindowPrivate*) drawable;
46 if (drawable_private->destroyed)
48 gc_private = (GdkGCPrivate*) gc;
50 XDrawPoint (drawable_private->xdisplay, drawable_private->xwindow,
51 gc_private->xgc, x, y);
55 gdk_draw_line (GdkDrawable *drawable,
62 GdkWindowPrivate *drawable_private;
63 GdkGCPrivate *gc_private;
65 g_return_if_fail (drawable != NULL);
66 g_return_if_fail (gc != NULL);
68 drawable_private = (GdkWindowPrivate*) drawable;
69 if (drawable_private->destroyed)
71 gc_private = (GdkGCPrivate*) gc;
73 XDrawLine (drawable_private->xdisplay, drawable_private->xwindow,
74 gc_private->xgc, x1, y1, x2, y2);
78 gdk_draw_rectangle (GdkDrawable *drawable,
86 GdkWindowPrivate *drawable_private;
87 GdkGCPrivate *gc_private;
89 g_return_if_fail (drawable != NULL);
90 g_return_if_fail (gc != NULL);
92 drawable_private = (GdkWindowPrivate*) drawable;
93 if (drawable_private->destroyed)
95 gc_private = (GdkGCPrivate*) gc;
98 width = drawable_private->width;
100 height = drawable_private->height;
103 XFillRectangle (drawable_private->xdisplay, drawable_private->xwindow,
104 gc_private->xgc, x, y, width, height);
106 XDrawRectangle (drawable_private->xdisplay, drawable_private->xwindow,
107 gc_private->xgc, x, y, width, height);
111 gdk_draw_arc (GdkDrawable *drawable,
121 GdkWindowPrivate *drawable_private;
122 GdkGCPrivate *gc_private;
124 g_return_if_fail (drawable != NULL);
125 g_return_if_fail (gc != NULL);
127 drawable_private = (GdkWindowPrivate*) drawable;
128 if (drawable_private->destroyed)
130 gc_private = (GdkGCPrivate*) gc;
133 width = drawable_private->width;
135 height = drawable_private->height;
138 XFillArc (drawable_private->xdisplay, drawable_private->xwindow,
139 gc_private->xgc, x, y, width, height, angle1, angle2);
141 XDrawArc (drawable_private->xdisplay, drawable_private->xwindow,
142 gc_private->xgc, x, y, width, height, angle1, angle2);
146 gdk_draw_polygon (GdkDrawable *drawable,
152 GdkWindowPrivate *drawable_private;
153 GdkGCPrivate *gc_private;
154 GdkPoint *local_points = points;
155 gint local_npoints = npoints;
156 gint local_alloc = 0;
158 g_return_if_fail (drawable != NULL);
159 g_return_if_fail (gc != NULL);
161 drawable_private = (GdkWindowPrivate*) drawable;
162 if (drawable_private->destroyed)
164 gc_private = (GdkGCPrivate*) gc;
168 XFillPolygon (drawable_private->xdisplay, drawable_private->xwindow,
169 gc_private->xgc, (XPoint*) points, npoints, Complex, CoordModeOrigin);
173 if ((points[0].x != points[npoints-1].x) ||
174 (points[0].y != points[npoints-1].y))
178 local_points = (GdkPoint*) g_malloc (local_npoints * sizeof(GdkPoint));
179 memcpy (local_points, points, npoints * sizeof(GdkPoint));
180 local_points[npoints].x = points[0].x;
181 local_points[npoints].y = points[0].y;
184 XDrawLines (drawable_private->xdisplay, drawable_private->xwindow,
186 (XPoint*) local_points, local_npoints,
190 g_free (local_points);
196 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
198 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
201 gdk_draw_string (GdkDrawable *drawable,
208 GdkWindowPrivate *drawable_private;
209 GdkFontPrivate *font_private;
210 GdkGCPrivate *gc_private;
212 g_return_if_fail (drawable != NULL);
213 g_return_if_fail (font != NULL);
214 g_return_if_fail (gc != NULL);
215 g_return_if_fail (string != NULL);
217 drawable_private = (GdkWindowPrivate*) drawable;
218 if (drawable_private->destroyed)
220 gc_private = (GdkGCPrivate*) gc;
221 font_private = (GdkFontPrivate*) font;
223 if (font->type == GDK_FONT_FONT)
225 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
226 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
227 if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
229 XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
230 gc_private->xgc, x, y, string, strlen (string));
234 XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
235 gc_private->xgc, x, y, (XChar2b *) string,
236 strlen (string) / 2);
239 else if (font->type == GDK_FONT_FONTSET)
241 XFontSet fontset = (XFontSet) font_private->xfont;
242 XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
243 fontset, gc_private->xgc, x, y, string, strlen (string));
246 g_error("undefined font type\n");
251 * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
253 * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
256 gdk_draw_text (GdkDrawable *drawable,
264 GdkWindowPrivate *drawable_private;
265 GdkFontPrivate *font_private;
266 GdkGCPrivate *gc_private;
268 g_return_if_fail (drawable != NULL);
269 g_return_if_fail (font != NULL);
270 g_return_if_fail (gc != NULL);
271 g_return_if_fail (text != NULL);
273 drawable_private = (GdkWindowPrivate*) drawable;
274 if (drawable_private->destroyed)
276 gc_private = (GdkGCPrivate*) gc;
277 font_private = (GdkFontPrivate*) font;
279 if (font->type == GDK_FONT_FONT)
281 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
282 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
283 if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
285 XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
286 gc_private->xgc, x, y, text, text_length);
290 XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow,
291 gc_private->xgc, x, y, (XChar2b *) text, text_length / 2);
294 else if (font->type == GDK_FONT_FONTSET)
296 XFontSet fontset = (XFontSet) font_private->xfont;
297 XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow,
298 fontset, gc_private->xgc, x, y, text, text_length);
301 g_error("undefined font type\n");
305 gdk_draw_text_wc (GdkDrawable *drawable,
310 const GdkWChar *text,
313 GdkWindowPrivate *drawable_private;
314 GdkFontPrivate *font_private;
315 GdkGCPrivate *gc_private;
317 g_return_if_fail (drawable != NULL);
318 g_return_if_fail (font != NULL);
319 g_return_if_fail (gc != NULL);
320 g_return_if_fail (text != NULL);
322 drawable_private = (GdkWindowPrivate*) drawable;
323 if (drawable_private->destroyed)
325 gc_private = (GdkGCPrivate*) gc;
326 font_private = (GdkFontPrivate*) font;
328 if (font->type == GDK_FONT_FONT)
330 XFontStruct *xfont = (XFontStruct *) font_private->xfont;
333 XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid);
334 text_8bit = g_new (gchar, text_length);
335 for (i=0; i<text_length; i++) text_8bit[i] = text[i];
336 XDrawString (drawable_private->xdisplay, drawable_private->xwindow,
337 gc_private->xgc, x, y, text_8bit, text_length);
340 else if (font->type == GDK_FONT_FONTSET)
342 if (sizeof(GdkWChar) == sizeof(wchar_t))
344 XwcDrawString (drawable_private->xdisplay, drawable_private->xwindow,
345 (XFontSet) font_private->xfont,
346 gc_private->xgc, x, y, (wchar_t *)text, text_length);
352 text_wchar = g_new (wchar_t, text_length);
353 for (i=0; i<text_length; i++) text_wchar[i] = text[i];
354 XwcDrawString (drawable_private->xdisplay, drawable_private->xwindow,
355 (XFontSet) font_private->xfont,
356 gc_private->xgc, x, y, text_wchar, text_length);
361 g_error("undefined font type\n");
365 gdk_draw_pixmap (GdkDrawable *drawable,
375 GdkWindowPrivate *drawable_private;
376 GdkWindowPrivate *src_private;
377 GdkGCPrivate *gc_private;
379 g_return_if_fail (drawable != NULL);
380 g_return_if_fail (src != NULL);
381 g_return_if_fail (gc != NULL);
383 drawable_private = (GdkWindowPrivate*) drawable;
384 src_private = (GdkWindowPrivate*) src;
385 if (drawable_private->destroyed || src_private->destroyed)
387 gc_private = (GdkGCPrivate*) gc;
390 width = src_private->width;
392 height = src_private->height;
394 XCopyArea (drawable_private->xdisplay,
395 src_private->xwindow,
396 drawable_private->xwindow,
404 gdk_draw_image (GdkDrawable *drawable,
414 GdkImagePrivate *image_private;
416 g_return_if_fail (drawable != NULL);
417 g_return_if_fail (image != NULL);
418 g_return_if_fail (gc != NULL);
420 image_private = (GdkImagePrivate*) image;
422 g_return_if_fail (image_private->image_put != NULL);
425 width = image->width;
427 height = image->height;
429 (* image_private->image_put) (drawable, gc, image, xsrc, ysrc,
430 xdest, ydest, width, height);
434 gdk_draw_points (GdkDrawable *drawable,
439 GdkWindowPrivate *drawable_private;
440 GdkGCPrivate *gc_private;
442 g_return_if_fail (drawable != NULL);
443 g_return_if_fail ((points != NULL) && (npoints > 0));
444 g_return_if_fail (gc != NULL);
446 drawable_private = (GdkWindowPrivate*) drawable;
447 if (drawable_private->destroyed)
449 gc_private = (GdkGCPrivate*) gc;
451 XDrawPoints (drawable_private->xdisplay,
452 drawable_private->xwindow,
460 gdk_draw_segments (GdkDrawable *drawable,
465 GdkWindowPrivate *drawable_private;
466 GdkGCPrivate *gc_private;
471 g_return_if_fail (drawable != NULL);
472 g_return_if_fail (segs != NULL);
473 g_return_if_fail (gc != NULL);
475 drawable_private = (GdkWindowPrivate*) drawable;
476 if (drawable_private->destroyed)
478 gc_private = (GdkGCPrivate*) gc;
480 XDrawSegments (drawable_private->xdisplay,
481 drawable_private->xwindow,
488 gdk_draw_lines (GdkDrawable *drawable,
493 GdkWindowPrivate *drawable_private;
494 GdkGCPrivate *gc_private;
499 g_return_if_fail (drawable != NULL);
500 g_return_if_fail (points != NULL);
501 g_return_if_fail (gc != NULL);
503 drawable_private = (GdkWindowPrivate*) drawable;
504 gc_private = (GdkGCPrivate*) gc;
506 XDrawLines (drawable_private->xdisplay,
507 drawable_private->xwindow,