diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-07-02 17:03:21 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-07-02 17:03:21 +0000 |
commit | 4f1ccca5940937ca184c331e035c71ef84675193 (patch) | |
tree | 686f66036477376e3d6038eb75bd8b4943ec1459 /gdk/gdkgc.c | |
parent | 7164c0acb138778fb973b0b48a70ff53d4a6e9b9 (diff) | |
download | gdk-pixbuf-4f1ccca5940937ca184c331e035c71ef84675193.tar.gz |
Add gdk_rgb_find_color() to get a pixel value using GdkRGB functionality
Sun Jul 2 12:45:50 2000 Owen Taylor <otaylor@redhat.com>
* gdk/gdkrgb.[ch]: Add gdk_rgb_find_color() to get a pixel
value using GdkRGB functionality given GdkColormap and GdkColor.
(name not final, waiting for inspiration.)
* gdk/gdkgc.[ch] (gdk_gc_set_rgb_fg/bg_color): New functions to
set the foreground/background of a GC using the GC's colormap
and GdkRGB. (name not final, waiting for inspiration.)
* gdk/gdkcompat.h gdk/gdkrgb.c (gdk_rgb_get_colormap): Rename from
gdk_rgb_get_cmap(), put #define in gdkcompat.h.
* gtk/gtkwidget.[ch] gtkcompat.h: Make visuals for
gtk_widget_get_visual(), gtk_widget_get_default_visual, etc,
purely a function of the corresponding colormap. Make
gtk_widget_set_visual(), etc, noop macros in gtkcompat.h.
* gdk/gdkpixmap.c gdk/x11/gdkpixmap-c11.c: Rewrite
gdk_pixbuf_*create_from_xpm_* in terms of
gdk_pixbuf_new_from_xpm_data(), move into platform independent
code.
* gdk/gdkpixbuf-render.c (gdk_pixbuf_render_to_drawable): Take
advantage of the new draw_rgb_32_image_dithalign.
* gdk/gdkrgb.c (gdk_draw_rgb_32_image_dithalign): Added.
* gtk/gtkgc.c (gtk_gc_new): Set the appropriate colormap
on each created GC.
* gdk/gdkgc.[ch]: Add gdk_gc_get/set_colormap.
* gdk/gdkgc.[ch]: Add a colormap field to the GdkGC structure
which we initialize from the drawable when the GC is created,
if the drawable has a colormap.
* gdk/x11/gdkgc-x11.c: include string.h for memset.
* gdk/x11/gdkinput-x11.c: include string.h for strlen, etc.
* gtk/gtklayout.[ch]: Remove unsed configure serial member.
Diffstat (limited to 'gdk/gdkgc.c')
-rw-r--r-- | gdk/gdkgc.c | 155 |
1 files changed, 154 insertions, 1 deletions
diff --git a/gdk/gdkgc.c b/gdk/gdkgc.c index 099ba1cc2..8a54612e2 100644 --- a/gdk/gdkgc.c +++ b/gdk/gdkgc.c @@ -27,8 +27,14 @@ #include <string.h> #include "gdkgc.h" +#include "gdkrgb.h" #include "gdkprivate.h" +static void gdk_gc_class_init (GObjectClass *class); +static void gdk_gc_finalize (GObject *object); + +GObjectClass *parent_class; + GType gdk_gc_get_type (void) { @@ -41,7 +47,7 @@ gdk_gc_get_type (void) sizeof (GdkGCClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, - (GClassInitFunc) NULL, + (GClassInitFunc) gdk_gc_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (GdkGC), @@ -57,6 +63,14 @@ gdk_gc_get_type (void) return object_type; } +static void +gdk_gc_class_init (GObjectClass *class) +{ + parent_class = g_type_class_peek_parent (class); + + class->finalize = gdk_gc_finalize; +} + GdkGC* gdk_gc_new (GdkDrawable *drawable) { @@ -90,9 +104,24 @@ gdk_gc_new_with_values (GdkDrawable *drawable, if (values_mask & GDK_GC_TS_Y_ORIGIN) gc->ts_y_origin = values->ts_y_origin; + gc->colormap = gdk_drawable_get_colormap (drawable); + if (gc->colormap) + g_object_ref (G_OBJECT (gc->colormap)); + return gc; } +static void +gdk_gc_finalize (GObject *object) +{ + GdkGC *gc = GDK_GC (object); + + if (gc->colormap) + g_object_unref (G_OBJECT (gc->colormap)); + + parent_class->finalize (object); +} + GdkGC * gdk_gc_ref (GdkGC *gc) { @@ -323,3 +352,127 @@ gdk_gc_set_dashes (GdkGC *gc, GDK_GC_GET_CLASS (gc)->set_dashes (gc, dash_offset, dash_list, n); } + +/** + * gdk_gc_set_colormap: + * @gc: a #GdkGC + * @colormap: a #GdkColormap + * + * Sets the colormap for the GC to the given colormap. The depth + * of the colormap's visual must match the depth of the drawable + * for which the GC was created. + **/ +void +gdk_gc_set_colormap (GdkGC *gc, + GdkColormap *colormap) +{ + g_return_if_fail (GDK_IS_GC (gc)); + g_return_if_fail (GDK_IS_COLORMAP (colormap)); + + if (gc->colormap != colormap) + { + if (gc->colormap) + g_object_unref (G_OBJECT (gc->colormap)); + + gc->colormap = colormap; + g_object_ref (G_OBJECT (gc->colormap)); + } + +} + +/** + * gdk_gc_get_colormap: + * @gc: a #GdkGC + * + * Retrieves the colormap for a given GC, if it exists. + * A GC will have a colormap if the drawable for which it was created + * has a colormap, or if a colormap was set explicitely with + * gdk_gc_set_colormap. + * + * Return value: + **/ +GdkColormap * +gdk_gc_get_colormap (GdkGC *gc) +{ + g_return_val_if_fail (GDK_IS_GC (gc), NULL); + + return gc->colormap; +} + +static GdkColormap * +gdk_gc_get_colormap_warn (GdkGC *gc) +{ + GdkColormap *colormap = gdk_gc_get_colormap (gc); + if (!colormap) + { + g_warning ("gdk_gc_set_rgb_fg_color() and gdk_gc_set_rgb_bg_color() can\n" + "only be used on GC's with a colormap. A GC will have a colormap\n" + "if it is created for a drawable with a colormap, or if a\n" + "colormap has been set explicitly with gdk_gc_set_colormap.\n"); + return NULL; + } + + return colormap; +} + +/** + * gdk_gc_set_rgb_fg_color: + * @gc: a #GdkGC + * @color: an unallocated #GdkColor. + * + * Set the foreground color of a GC using an unallocated color. The + * pixel value for the color will be determined using GdkRGB. If the + * colormap for the GC has not previously been initialized for GdkRGB, + * then for pseudo-color colormaps (colormaps with a small modifiable + * number of colors), a colorcube will be allocated in the colormap. + * + * Calling this function for a GC without a colormap is an error. + **/ +void +gdk_gc_set_rgb_fg_color (GdkGC *gc, GdkColor *color) +{ + GdkColormap *cmap; + GdkColor tmp_color; + + g_return_if_fail (GDK_IS_GC (gc)); + g_return_if_fail (color != NULL); + + cmap = gdk_gc_get_colormap_warn (gc); + if (!cmap) + return; + + tmp_color = *color; + gdk_rgb_find_color (cmap, &tmp_color); + gdk_gc_set_foreground (cmap, &tmp_color); +} + +/** + * gdk_gc_set_rgb_bg_color: + * @gc: a #GdkGC + * @color: an unallocated #GdkColor. + * + * Set the background color of a GC using an unallocated color. The + * pixel value for the color will be determined using GdkRGB. If the + * colormap for the GC has not previously been initialized for GdkRGB, + * then for pseudo-color colormaps (colormaps with a small modifiable + * number of colors), a colorcube will be allocated in the colormap. + * + * Calling this function for a GC without a colormap is an error. + **/ +void +gdk_gc_set_rgb_bg_color (GdkGC *gc, GdkColor *color) +{ + GdkColormap *cmap; + GdkColor tmp_color; + + g_return_if_fail (GDK_IS_GC (gc)); + g_return_if_fail (color != NULL); + + cmap = gdk_gc_get_colormap_warn (gc); + if (!cmap) + return; + + tmp_color = *color; + gdk_rgb_find_color (cmap, &tmp_color); + gdk_gc_set_foreground (cmap, &tmp_color); +} |