gdkdraw.c

Go to the documentation of this file.
00001 /* GDK - The GIMP Drawing Kit
00002  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Library General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Library General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Library General Public
00015  * License along with this library; if not, write to the
00016  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017  * Boston, MA 02111-1307, USA.
00018  */
00019 
00020 /*
00021  * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
00022  * file for a list of people on the GTK+ Team.  See the ChangeLog
00023  * files for a list of changes.  These files are distributed with
00024  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
00025  */
00026 
00027 #include "gdkdrawable.h"
00028 #include "gdkprivate.h"
00029 #include "gdkwindow.h"
00030 
00031 /* Manipulation of drawables
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 /* Drawing
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 /* gdk_draw_string
00237  *
00238  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
00239  *
00240  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
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 /* gdk_draw_text
00252  *
00253  * Modified by Li-Da Lho to draw 16 bits and Multibyte strings
00254  *
00255  * Interface changed: add "GdkFont *font" to specify font or fontset explicitely
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 }

Generated on Tue Jul 5 14:14:37 2011 for ROOT_528-00b_version by  doxygen 1.5.1