00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "gdkdrawable.h"
00028 #include "gdkprivate.h"
00029 #include "gdkwindow.h"
00030
00031
00032
00033 GdkDrawable *gdk_drawable_alloc(void)
00034 {
00035 GdkDrawablePrivate *private = g_new(GdkDrawablePrivate, 1);
00036 GdkDrawable *drawable = (GdkDrawable *) private;
00037
00038 drawable->user_data = NULL;
00039
00040 private->ref_count = 1;
00041 private->destroyed = FALSE;
00042 private->klass = NULL;
00043 private->klass_data = NULL;
00044 private->window_type = GDK_WINDOW_CHILD;
00045
00046 private->width = 1;
00047 private->height = 1;
00048
00049 private->colormap = NULL;
00050
00051 return drawable;
00052 }
00053
00054 void
00055 gdk_drawable_set_data(GdkDrawable * drawable,
00056 const gchar * key,
00057 gpointer data, GDestroyNotify destroy_func)
00058 {
00059 g_dataset_set_data_full(drawable, key, data, destroy_func);
00060 }
00061
00062 void gdk_drawable_get_data(GdkDrawable * drawable, const gchar * key)
00063 {
00064 g_dataset_get_data(drawable, key);
00065 }
00066
00067 GdkDrawableType gdk_drawable_get_type(GdkDrawable * drawable)
00068 {
00069 g_return_val_if_fail(drawable != NULL, (GdkDrawableType) - 1);
00070
00071 return GDK_DRAWABLE_TYPE(drawable);
00072 }
00073
00074 void
00075 gdk_drawable_get_size(GdkDrawable * drawable, gint * width, gint * height)
00076 {
00077 GdkDrawablePrivate *drawable_private;
00078
00079 g_return_if_fail(drawable != NULL);
00080
00081 drawable_private = (GdkDrawablePrivate *) drawable;
00082
00083 if (width)
00084 *width = drawable_private->width;
00085 if (height)
00086 *height = drawable_private->height;
00087 }
00088
00089 GdkVisual *gdk_drawable_get_visual(GdkDrawable * drawable)
00090 {
00091 GdkColormap *colormap;
00092
00093 g_return_val_if_fail(drawable != NULL, NULL);
00094
00095 colormap = gdk_drawable_get_colormap(drawable);
00096 return colormap ? gdk_colormap_get_visual(colormap) : NULL;
00097 }
00098
00099 GdkDrawable *gdk_drawable_ref(GdkDrawable * drawable)
00100 {
00101 GdkDrawablePrivate *private = (GdkDrawablePrivate *) drawable;
00102 g_return_val_if_fail(drawable != NULL, NULL);
00103
00104 private->ref_count += 1;
00105 return drawable;
00106 }
00107
00108 void gdk_drawable_unref(GdkDrawable * drawable)
00109 {
00110 GdkDrawablePrivate *private = (GdkDrawablePrivate *) drawable;
00111
00112 if ((drawable == NULL) || (private->ref_count <= 0))
00113 return;
00114 g_return_if_fail(drawable != NULL);
00115 g_return_if_fail(private->ref_count > 0);
00116
00117 private->ref_count -= 1;
00118 if (private->ref_count == 0) {
00119 GDK_NOTE(MISC, g_print("calling class destroy method\n"));
00120 private->klass->destroy(drawable);
00121 g_dataset_destroy(drawable);
00122 g_free(drawable);
00123 }
00124 }
00125
00126
00127
00128 void gdk_draw_point(GdkDrawable * drawable, GdkGC * gc, gint x, gint y)
00129 {
00130 GdkGCPrivate *gc_private;
00131 GdkPoint point;
00132
00133 g_return_if_fail(drawable != NULL);
00134 g_return_if_fail(gc != NULL);
00135
00136 if (GDK_DRAWABLE_DESTROYED(drawable))
00137 return;
00138 gc_private = (GdkGCPrivate *) gc;
00139
00140 point.x = x;
00141 point.y = y;
00142
00143 ((GdkDrawablePrivate *) drawable)->klass->draw_points(drawable, gc,
00144 &point, 1);
00145 }
00146
00147 void
00148 gdk_draw_line(GdkDrawable * drawable,
00149 GdkGC * gc, gint x1, gint y1, gint x2, gint y2)
00150 {
00151 GdkGCPrivate *gc_private;
00152 GdkSegment segment;
00153
00154 g_return_if_fail(drawable != NULL);
00155 g_return_if_fail(gc != NULL);
00156
00157 if (GDK_DRAWABLE_DESTROYED(drawable))
00158 return;
00159 gc_private = (GdkGCPrivate *) gc;
00160
00161 segment.x1 = x1;
00162 segment.y1 = y1;
00163 segment.x2 = x2;
00164 segment.y2 = y2;
00165 ((GdkDrawablePrivate *) drawable)->klass->draw_segments(drawable, gc,
00166 &segment, 1);
00167 }
00168
00169 void
00170 gdk_draw_rectangle(GdkDrawable * drawable,
00171 GdkGC * gc,
00172 gint filled, gint x, gint y, gint width, gint height)
00173 {
00174 GdkDrawablePrivate *drawable_private;
00175
00176 g_return_if_fail(drawable != NULL);
00177 g_return_if_fail(gc != NULL);
00178
00179 drawable_private = (GdkDrawablePrivate *) drawable;
00180 if (GDK_DRAWABLE_DESTROYED(drawable))
00181 return;
00182
00183 if (width < 0)
00184 width = drawable_private->width;
00185 if (height < 0)
00186 height = drawable_private->height;
00187
00188 ((GdkDrawablePrivate *) drawable)->klass->draw_rectangle(drawable, gc,
00189 filled, x, y,
00190 width, height);
00191 }
00192
00193 void
00194 gdk_draw_arc(GdkDrawable * drawable,
00195 GdkGC * gc,
00196 gint filled,
00197 gint x,
00198 gint y, gint width, gint height, gint angle1, gint angle2)
00199 {
00200 GdkDrawablePrivate *drawable_private;
00201 GdkGCPrivate *gc_private;
00202
00203 g_return_if_fail(drawable != NULL);
00204 g_return_if_fail(gc != NULL);
00205
00206 drawable_private = (GdkDrawablePrivate *) drawable;
00207 if (GDK_DRAWABLE_DESTROYED(drawable))
00208 return;
00209 gc_private = (GdkGCPrivate *) gc;
00210
00211 if (width < 0)
00212 width = drawable_private->width;
00213 if (height < 0)
00214 height = drawable_private->height;
00215
00216 ((GdkDrawablePrivate *) drawable)->klass->draw_arc(drawable, gc, filled,
00217 x, y, width, height,
00218 angle1, angle2);
00219 }
00220
00221 void
00222 gdk_draw_polygon(GdkDrawable * drawable,
00223 GdkGC * gc, gint filled, GdkPoint * points, gint npoints)
00224 {
00225 g_return_if_fail(drawable != NULL);
00226 g_return_if_fail(gc != NULL);
00227
00228 if (GDK_DRAWABLE_DESTROYED(drawable))
00229 return;
00230
00231 ((GdkDrawablePrivate *) drawable)->klass->draw_polygon(drawable, gc,
00232 filled, points,
00233 npoints);
00234 }
00235
00236
00237
00238
00239
00240
00241
00242 void
00243 gdk_draw_string(GdkDrawable * drawable,
00244 GdkFont * font,
00245 GdkGC * gc, gint x, gint y, const gchar * string)
00246 {
00247 gdk_draw_text(drawable, font, gc, x, y, string,
00248 _gdk_font_strlen(font, string));
00249 }
00250
00251
00252
00253
00254
00255
00256
00257 void
00258 gdk_draw_text(GdkDrawable * drawable,
00259 GdkFont * font,
00260 GdkGC * gc,
00261 gint x, gint y, const gchar * text, gint text_length)
00262 {
00263 g_return_if_fail(drawable != NULL);
00264 g_return_if_fail(font != NULL);
00265 g_return_if_fail(gc != NULL);
00266 g_return_if_fail(text != NULL);
00267
00268 ((GdkDrawablePrivate *) drawable)->klass->draw_text(drawable, font, gc,
00269 x, y, text,
00270 text_length);
00271 }
00272
00273 void
00274 gdk_draw_text_wc(GdkDrawable * drawable,
00275 GdkFont * font,
00276 GdkGC * gc,
00277 gint x, gint y, const GdkWChar * text, gint text_length)
00278 {
00279 g_return_if_fail(drawable != NULL);
00280 g_return_if_fail(font != NULL);
00281 g_return_if_fail(gc != NULL);
00282 g_return_if_fail(text != NULL);
00283
00284 ((GdkDrawablePrivate *) drawable)->klass->draw_text_wc(drawable, font,
00285 gc, x, y, text,
00286 text_length);
00287 }
00288
00289 void
00290 gdk_draw_drawable(GdkDrawable * drawable,
00291 GdkGC * gc,
00292 GdkDrawable * src,
00293 gint xsrc,
00294 gint ysrc,
00295 gint xdest, gint ydest, gint width, gint height)
00296 {
00297 g_return_if_fail(drawable != NULL);
00298 g_return_if_fail(src != NULL);
00299 g_return_if_fail(gc != NULL);
00300
00301 if (GDK_DRAWABLE_DESTROYED(drawable) || GDK_DRAWABLE_DESTROYED(src))
00302 return;
00303
00304 if (width == -1)
00305 width = ((GdkDrawablePrivate *) src)->width;
00306 if (height == -1)
00307 height = ((GdkDrawablePrivate *) src)->height;
00308
00309 ((GdkDrawablePrivate *) drawable)->klass->draw_drawable(drawable, gc,
00310 src, xsrc, ysrc,
00311 xdest, ydest,
00312 width, height);
00313 }
00314
00315 void
00316 gdk_draw_image(GdkDrawable * drawable,
00317 GdkGC * gc,
00318 GdkImage * image,
00319 gint xsrc,
00320 gint ysrc, gint xdest, gint ydest, gint width, gint height)
00321 {
00322 GdkImagePrivate *image_private;
00323
00324 g_return_if_fail(drawable != NULL);
00325 g_return_if_fail(image != NULL);
00326 g_return_if_fail(gc != NULL);
00327
00328 image_private = (GdkImagePrivate *) image;
00329
00330 if (width == -1)
00331 width = image->width;
00332 if (height == -1)
00333 height = image->height;
00334
00335
00336 image_private->klass->image_put(image, drawable, gc, xsrc, ysrc,
00337 xdest, ydest, width, height);
00338 }
00339
00340 void
00341 gdk_draw_points(GdkDrawable * drawable,
00342 GdkGC * gc, GdkPoint * points, gint npoints)
00343 {
00344 g_return_if_fail(drawable != NULL);
00345 g_return_if_fail((points != NULL) && (npoints > 0));
00346 g_return_if_fail(gc != NULL);
00347 g_return_if_fail(npoints >= 0);
00348
00349 if (npoints == 0)
00350 return;
00351
00352 if (GDK_DRAWABLE_DESTROYED(drawable))
00353 return;
00354
00355 ((GdkDrawablePrivate *) drawable)->klass->draw_points(drawable, gc,
00356 points, npoints);
00357 }
00358
00359 void
00360 gdk_draw_segments(GdkDrawable * drawable,
00361 GdkGC * gc, GdkSegment * segs, gint nsegs)
00362 {
00363 g_return_if_fail(drawable != NULL);
00364
00365 if (nsegs == 0)
00366 return;
00367
00368 g_return_if_fail(segs != NULL);
00369 g_return_if_fail(gc != NULL);
00370 g_return_if_fail(nsegs >= 0);
00371
00372 if (GDK_DRAWABLE_DESTROYED(drawable))
00373 return;
00374
00375 ((GdkDrawablePrivate *) drawable)->klass->draw_segments(drawable, gc,
00376 segs, nsegs);
00377 }
00378
00379 void
00380 gdk_draw_lines(GdkDrawable * drawable,
00381 GdkGC * gc, GdkPoint * points, gint npoints)
00382 {
00383
00384 g_return_if_fail(drawable != NULL);
00385 g_return_if_fail(points != NULL);
00386 g_return_if_fail(gc != NULL);
00387 g_return_if_fail(npoints >= 0);
00388
00389 if (npoints == 0)
00390 return;
00391
00392 if (GDK_DRAWABLE_DESTROYED(drawable))
00393 return;
00394
00395 ((GdkDrawablePrivate *) drawable)->klass->draw_lines(drawable, gc,
00396 points, npoints);
00397 }