summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author3 <alexl@redhat.com>2001-01-23 15:28:18 +0000
committerAlexander Larsson <alexl@src.gnome.org>2001-01-23 15:28:18 +0000
commitbedaf31f280650b25facef66499f34def97cb08c (patch)
tree764c2522bb46730324ec38b6876190c5f61bb548
parentc181cd8efcaacfd65d289eae319292a944402b87 (diff)
downloadgtk+-bedaf31f280650b25facef66499f34def97cb08c.tar.gz
Don't leak image. Simplify using gdk_colormap_query_color().
2001-01-23 <alexl@redhat.com> * gtk/gtkcolorsel.c (grab_color_at_mouse): Don't leak image. Simplify using gdk_colormap_query_color(). (gtk_color_selection_init): Don't leak dropper_pixmap and mask. * linux-fb/gdkcolor-fb.c: Implemented gdk_colormap_query_color.
-rw-r--r--gdk/linux-fb/gdkcolor-fb.c34
-rw-r--r--gtk/gtkcolorsel.c49
2 files changed, 46 insertions, 37 deletions
diff --git a/gdk/linux-fb/gdkcolor-fb.c b/gdk/linux-fb/gdkcolor-fb.c
index ed32cd9ce3..615b5b605e 100644
--- a/gdk/linux-fb/gdkcolor-fb.c
+++ b/gdk/linux-fb/gdkcolor-fb.c
@@ -916,3 +916,37 @@ gdk_colors_free (GdkColormap *colormap,
}
}
}
+
+
+void
+gdk_colormap_query_color (GdkColormap *colormap,
+ gulong pixel,
+ GdkColor *result)
+{
+ GdkVisual *visual;
+
+ g_return_if_fail (GDK_IS_COLORMAP (colormap));
+
+ visual = gdk_colormap_get_visual (colormap);
+
+ switch (visual->type) {
+ case GDK_VISUAL_DIRECT_COLOR:
+ case GDK_VISUAL_TRUE_COLOR:
+ result->red = 65535. * (double)((pixel & visual->red_mask) >> visual->red_shift) / ((1 << visual->red_prec) - 1);
+ result->green = 65535. * (double)((pixel & visual->green_mask) >> visual->green_shift) / ((1 << visual->green_prec) - 1);
+ result->blue = 65535. * (double)((pixel & visual->blue_mask) >> visual->blue_shift) / ((1 << visual->blue_prec) - 1);
+ break;
+ case GDK_VISUAL_STATIC_GRAY:
+ case GDK_VISUAL_GRAYSCALE:
+ result->red = result->green = result->blue = 65535. * (double)pixel/((1<<visual->depth) - 1);
+ break;
+ case GDK_VISUAL_PSEUDO_COLOR:
+ result->red = colormap->colors[pixel].red;
+ result->green = colormap->colors[pixel].green;
+ result->blue = colormap->colors[pixel].blue;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c
index f8893ca93f..b82dc62f84 100644
--- a/gtk/gtkcolorsel.c
+++ b/gtk/gtkcolorsel.c
@@ -867,51 +867,22 @@ grab_color_at_mouse (GtkWidget *button,
{
GdkImage *image;
guint32 pixel;
- GdkVisual *visual;
GtkColorSelection *colorsel = data;
ColorSelectionPrivate *priv;
GdkColormap *colormap = gdk_colormap_get_system ();
-#if defined (GDK_WINDOWING_X11)
- XColor xcolor;
-#endif
+ GdkColor color;
priv = colorsel->private_data;
image = gdk_image_get (GDK_ROOT_PARENT (), x_root, y_root, 1, 1);
pixel = gdk_image_get_pixel (image, 0, 0);
- visual = gdk_colormap_get_visual (colormap);
-
- switch (visual->type) {
- case GDK_VISUAL_DIRECT_COLOR:
- case GDK_VISUAL_TRUE_COLOR:
- priv->color[COLORSEL_RED] = (double)((pixel & visual->red_mask)>>visual->red_shift)/((1<<visual->red_prec) - 1);
- priv->color[COLORSEL_GREEN] = (double)((pixel & visual->green_mask)>>visual->green_shift)/((1<<visual->green_prec) - 1);
- priv->color[COLORSEL_BLUE] = (double)((pixel & visual->blue_mask)>>visual->blue_shift)/((1<<visual->blue_prec) - 1);
- break;
- case GDK_VISUAL_STATIC_GRAY:
- case GDK_VISUAL_GRAYSCALE:
- priv->color[COLORSEL_RED] = (double)pixel/((1<<visual->depth) - 1);
- priv->color[COLORSEL_GREEN] = (double)pixel/((1<<visual->depth) - 1);
- priv->color[COLORSEL_BLUE] = (double)pixel/((1<<visual->depth) - 1);
- break;
-#if defined (GDK_WINDOWING_X11)
- case GDK_VISUAL_STATIC_COLOR:
- xcolor.pixel = pixel;
- XQueryColor (GDK_DISPLAY (), GDK_COLORMAP_XCOLORMAP (colormap), &xcolor);
- priv->color[COLORSEL_RED] = xcolor.red/65535.0;
- priv->color[COLORSEL_GREEN] = xcolor.green/65535.0;
- priv->color[COLORSEL_BLUE] = xcolor.blue/65535.0;
- break;
-#endif
- case GDK_VISUAL_PSEUDO_COLOR:
- priv->color[COLORSEL_RED] = colormap->colors[pixel].red/(double)0xffffff;
- priv->color[COLORSEL_GREEN] = colormap->colors[pixel].green/(double)0xffffff;
- priv->color[COLORSEL_BLUE] = colormap->colors[pixel].blue/(double)0xffffff;
- break;
- default:
- g_assert_not_reached ();
- break;
- }
+ gdk_image_unref (image);
+
+ gdk_colormap_query_color (colormap, pixel, &color);
+
+ priv->color[COLORSEL_RED] = (double)color.red / 65535.0;
+ priv->color[COLORSEL_GREEN] = (double)color.green / 65535.0;
+ priv->color[COLORSEL_BLUE] = (double)color.blue / 65535.0;
gtk_rgb_to_hsv (priv->color[COLORSEL_RED],
priv->color[COLORSEL_GREEN],
@@ -919,6 +890,7 @@ grab_color_at_mouse (GtkWidget *button,
&priv->color[COLORSEL_HUE],
&priv->color[COLORSEL_SATURATION],
&priv->color[COLORSEL_VALUE]);
+
update_color (colorsel);
}
@@ -1397,6 +1369,9 @@ gtk_color_selection_init (GtkColorSelection *colorsel)
gtk_signal_connect (GTK_OBJECT (button), "clicked", get_screen_color, NULL);
dropper_pixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap (button), &mask, NULL, picker);
dropper_image = gtk_pixmap_new (dropper_pixmap, mask);
+ gdk_pixmap_unref (dropper_pixmap);
+ if (mask)
+ gdk_pixmap_unref (mask);
gtk_container_add (GTK_CONTAINER (button), dropper_image);
gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);