summaryrefslogtreecommitdiff
path: root/gdk/gdkgc.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-07-02 17:03:21 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-07-02 17:03:21 +0000
commit4f1ccca5940937ca184c331e035c71ef84675193 (patch)
tree686f66036477376e3d6038eb75bd8b4943ec1459 /gdk/gdkgc.c
parent7164c0acb138778fb973b0b48a70ff53d4a6e9b9 (diff)
downloadgdk-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.c155
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);
+}