diff options
author | Havoc Pennington <hp@redhat.com> | 2001-02-09 00:40:48 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2001-02-09 00:40:48 +0000 |
commit | 45510aefc34ce131b5de0db7c4ebf3783d9854b4 (patch) | |
tree | 42b08773edbea6846d0d2e7e3123d85ec5fc6c1f | |
parent | 589b4726093be0f1653648110d5e40150f2e375c (diff) | |
download | gdk-pixbuf-45510aefc34ce131b5de0db7c4ebf3783d9854b4.tar.gz |
better error message if you try to add a widget to a bin that already has
2001-02-08 Havoc Pennington <hp@redhat.com>
* gtk/gtkbin.c (gtk_bin_add): better error message if you try to
add a widget to a bin that already has a child.
* gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512
* docs/Changes-2.0.txt: note that GdkColorContext is gone.
* gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c
* gdk/gdk.h: remove gdkcc.h
* gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h
* gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using
GdkPixbuf, since the previous implementation was GdkColorContext
dependent.
* gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap
-rw-r--r-- | ChangeLog | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 21 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 21 | ||||
-rw-r--r-- | docs/Changes-2.0.txt | 3 | ||||
-rw-r--r-- | gdk/Makefile.am | 1 | ||||
-rw-r--r-- | gdk/gdk.h | 1 | ||||
-rw-r--r-- | gdk/gdkcc.h | 149 | ||||
-rw-r--r-- | gdk/x11/Makefile.am | 1 | ||||
-rw-r--r-- | gdk/x11/gdkcc-x11.c | 1723 | ||||
-rw-r--r-- | gtk/gtkbin.c | 13 | ||||
-rw-r--r-- | gtk/gtkpixmap.c | 115 | ||||
-rw-r--r-- | gtk/testgtk.c | 15 | ||||
-rw-r--r-- | tests/testgtk.c | 15 |
17 files changed, 220 insertions, 1963 deletions
@@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5edd51fae..311b270fc 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,24 @@ +2001-02-08 Havoc Pennington <hp@redhat.com> + + * gtk/gtkbin.c (gtk_bin_add): better error message if you try to + add a widget to a bin that already has a child. + + * gdk/gdkcc.h, gdk/gdkcc-x11.c: Remove GdkColorContext, #50512 + + * docs/Changes-2.0.txt: note that GdkColorContext is gone. + + * gdk/x11/Makefile.am (libgdk_x11_la_SOURCES): remove gdkcc-x11.c + + * gdk/gdk.h: remove gdkcc.h + + * gdk/Makefile.am (gdk_public_h_sources): remove gdkcc.h + + * gtk/gtkpixmap.c (build_insensitive_pixmap): rewrite using + GdkPixbuf, since the previous implementation was GdkColorContext + dependent. + + * gtk/testgtk.c (create_pixmap): add test for insensitive GtkPixmap + Thu Feb 8 19:00:00 2001 Jonathan Blandford <jrb@redhat.com> * gtk/gtktreeview.c (TREE_VIEW_VERTICAL_SEPARATOR): moved back to diff --git a/docs/Changes-2.0.txt b/docs/Changes-2.0.txt index fc0e8512d..b8d044980 100644 --- a/docs/Changes-2.0.txt +++ b/docs/Changes-2.0.txt @@ -293,3 +293,6 @@ Incompatible Changes from GTK+-1.2 to GTK+-2.0: broken widgets are not declared in the headers by default; to use them, define the symbol GTK_ENABLE_BROKEN during compilation. In some future release, these widgets will be removed from GTK+. + +- GdkColorContext is gone; you probably weren't using it anyway. + Use GdkColormap and the gdk_rgb_* functions instead. diff --git a/gdk/Makefile.am b/gdk/Makefile.am index 404954bd2..3aafb1a4b 100644 --- a/gdk/Makefile.am +++ b/gdk/Makefile.am @@ -51,7 +51,6 @@ LDFLAGS = @STRIP_BEGIN@ \ # gdk_public_h_sources = @STRIP_BEGIN@ \ gdk.h \ - gdkcc.h \ gdkcolor.h \ gdkcompat.h \ gdkcursor.h \ @@ -27,7 +27,6 @@ #ifndef __GDK_H__ #define __GDK_H__ -#include <gdk/gdkcc.h> #include <gdk/gdkcolor.h> #include <gdk/gdkcursor.h> #include <gdk/gdkdnd.h> diff --git a/gdk/gdkcc.h b/gdk/gdkcc.h deleted file mode 100644 index 5650dffdb..000000000 --- a/gdk/gdkcc.h +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef __GDK_CC_H__ -#define __GDK_CC_H__ - -#include <gdk/gdktypes.h> - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef struct _GdkColorContextDither GdkColorContextDither; -typedef struct _GdkColorContext GdkColorContext; - - -/* Color Context modes. - * - * GDK_CC_MODE_UNDEFINED - unknown - * GDK_CC_MODE_BW - default B/W - * GDK_CC_MODE_STD_CMAP - has a standard colormap - * GDK_CC_MODE_TRUE - is a TrueColor/DirectColor visual - * GDK_CC_MODE_MY_GRAY - my grayramp - * GDK_CC_MODE_PALETTE - has a pre-allocated palette - */ - -typedef enum -{ - GDK_CC_MODE_UNDEFINED, - GDK_CC_MODE_BW, - GDK_CC_MODE_STD_CMAP, - GDK_CC_MODE_TRUE, - GDK_CC_MODE_MY_GRAY, - GDK_CC_MODE_PALETTE -} GdkColorContextMode; - -struct _GdkColorContextDither -{ - gint fast_rgb[32][32][32]; /* quick look-up table for faster rendering */ - gint fast_err[32][32][32]; /* internal RGB error information */ - gint fast_erg[32][32][32]; - gint fast_erb[32][32][32]; -}; - -struct _GdkColorContext -{ - GdkVisual *visual; - GdkColormap *colormap; - - gint num_colors; /* available no. of colors in colormap */ - gint max_colors; /* maximum no. of colors */ - gint num_allocated; /* no. of allocated colors */ - - GdkColorContextMode mode; - gint need_to_free_colormap; - GdkAtom std_cmap_atom; - - gulong *clut; /* color look-up table */ - GdkColor *cmap; /* colormap */ - - GHashTable *color_hash; /* hash table of allocated colors */ - GdkColor *palette; /* preallocated palette */ - gint num_palette; /* size of palette */ - - GdkColorContextDither *fast_dither; /* fast dither matrix */ - - struct - { - gint red; - gint green; - gint blue; - } shifts; - - struct - { - gulong red; - gulong green; - gulong blue; - } masks; - - struct - { - gint red; - gint green; - gint blue; - } bits; - - gulong max_entry; - - gulong black_pixel; - gulong white_pixel; -}; - -GdkColorContext *gdk_color_context_new (GdkVisual *visual, - GdkColormap *colormap); - -GdkColorContext *gdk_color_context_new_mono (GdkVisual *visual, - GdkColormap *colormap); - -void gdk_color_context_free (GdkColorContext *cc); - -gulong gdk_color_context_get_pixel (GdkColorContext *cc, - gushort red, - gushort green, - gushort blue, - gint *failed); -void gdk_color_context_get_pixels (GdkColorContext *cc, - gushort *reds, - gushort *greens, - gushort *blues, - gint ncolors, - gulong *colors, - gint *nallocated); -void gdk_color_context_get_pixels_incremental (GdkColorContext *cc, - gushort *reds, - gushort *greens, - gushort *blues, - gint ncolors, - gint *used, - gulong *colors, - gint *nallocated); - -gint gdk_color_context_query_color (GdkColorContext *cc, - GdkColor *color); -gint gdk_color_context_query_colors (GdkColorContext *cc, - GdkColor *colors, - gint num_colors); - -gint gdk_color_context_add_palette (GdkColorContext *cc, - GdkColor *palette, - gint num_palette); - -void gdk_color_context_init_dither (GdkColorContext *cc); -void gdk_color_context_free_dither (GdkColorContext *cc); - -gulong gdk_color_context_get_pixel_from_palette (GdkColorContext *cc, - gushort *red, - gushort *green, - gushort *blue, - gint *failed); -guchar gdk_color_context_get_index_from_palette (GdkColorContext *cc, - gint *red, - gint *green, - gint *blue, - gint *failed); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __GDK_CC_H__ */ diff --git a/gdk/x11/Makefile.am b/gdk/x11/Makefile.am index dfa5a032b..b52021f63 100644 --- a/gdk/x11/Makefile.am +++ b/gdk/x11/Makefile.am @@ -43,7 +43,6 @@ endif libgdk_x11_la_SOURCES = \ MwmUtil.h \ - gdkcc-x11.c \ gdkcolor-x11.c \ gdkcursor-x11.c \ gdkdnd-x11.c \ diff --git a/gdk/x11/gdkcc-x11.c b/gdk/x11/gdkcc-x11.c deleted file mode 100644 index e86389ad4..000000000 --- a/gdk/x11/gdkcc-x11.c +++ /dev/null @@ -1,1723 +0,0 @@ -/* GDK - The GIMP Drawing Kit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* Color Context module - * Copyright 1994,1995 John L. Cwikla - * Copyright (C) 1997 by Ripley Software Development - * Copyright (C) 1997 by Federico Mena (port to Gtk/Gdk) - */ - -/* Copyright 1994,1995 John L. Cwikla - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appears in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of John L. Cwikla or - * Wolfram Research, Inc not be used in advertising or publicity - * pertaining to distribution of the software without specific, written - * prior permission. John L. Cwikla and Wolfram Research, Inc make no - * representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied warranty. - * - * John L. Cwikla and Wolfram Research, Inc disclaim all warranties with - * regard to this software, including all implied warranties of - * merchantability and fitness, in no event shall John L. Cwikla or - * Wolfram Research, Inc be liable for any special, indirect or - * consequential damages or any damages whatsoever resulting from loss of - * use, data or profits, whether in an action of contract, negligence or - * other tortious action, arising out of or in connection with the use or - * performance of this software. - * - * Author: - * John L. Cwikla - * X Programmer - * Wolfram Research Inc. - * - * cwikla@wri.com - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <stdlib.h> -#include <string.h> - -#include "gdkcc.h" -#include "gdkcolor.h" -#include "gdkx.h" -#include "gdkinternals.h" - -#define MAX_IMAGE_COLORS 256 - -typedef struct _GdkColorContextPrivate GdkColorContextPrivate; - -struct _GdkColorContextPrivate -{ - GdkColorContext color_context; - Display *xdisplay; - XStandardColormap std_cmap; -}; - -static guint -hash_color (gconstpointer key) -{ - const GdkColor *color = key; - - return (color->red * 33023 + color->green * 30013 + color->blue * 27011); -} - -static gint -compare_colors (gconstpointer a, - gconstpointer b) -{ - const GdkColor *aa = a; - const GdkColor *bb = b; - - return ((aa->red == bb->red) && (aa->green == bb->green) && (aa->blue == bb->blue)); -} - -static void -free_hash_entry (gpointer key, - gpointer value, - gpointer user_data) -{ - g_free (key); /* key and value are the same GdkColor */ -} - -static int -pixel_sort (const void *a, const void *b) -{ - return ((GdkColor *) a)->pixel - ((GdkColor *) b)->pixel; -} - -/* XXX: This function does an XQueryColors() the hard way, because there is - * no corresponding function in Gdk. - */ - -static void -my_x_query_colors (GdkColormap *colormap, - GdkColor *colors, - gint ncolors) -{ - XColor *xcolors; - gint i; - - xcolors = g_new (XColor, ncolors); - for (i = 0; i < ncolors; i++) - xcolors[i].pixel = colors[i].pixel; - - XQueryColors (gdk_display, GDK_COLORMAP_XCOLORMAP (colormap), xcolors, ncolors); - - for (i = 0; i < ncolors; i++) - { - colors[i].red = xcolors[i].red; - colors[i].green = xcolors[i].green; - colors[i].blue = xcolors[i].blue; - } - - g_free (xcolors); -} - -static void -query_colors (GdkColorContext *cc) -{ - gint i; - GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc; - cc->cmap = g_new (GdkColor, cc->num_colors); - - for (i = 0; i < cc->num_colors; i++) - cc->cmap[i].pixel = cc->clut ? cc->clut[i] : ccp->std_cmap.base_pixel + i; - - my_x_query_colors (cc->colormap, cc->cmap, cc->num_colors); - - qsort (cc->cmap, cc->num_colors, sizeof (GdkColor), pixel_sort); -} - -static void -init_bw (GdkColorContext *cc) -{ - GdkColor color; - - g_warning ("init_bw: failed to allocate colors, falling back to black and white"); - - cc->mode = GDK_CC_MODE_BW; - - color.red = color.green = color.blue = 0; - - if (!gdk_color_alloc (cc->colormap, &color)) - cc->black_pixel = 0; - else - cc->black_pixel = color.pixel; - - color.red = color.green = color.blue = 0xffff; - - if (!gdk_color_alloc (cc->colormap, &color)) - cc->white_pixel = cc->black_pixel ? 0 : 1; - else - cc->white_pixel = color.pixel; - - cc->num_colors = 2; -} - -static void -init_gray (GdkColorContext *cc) -{ - GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc; - GdkColor *clrs, *cstart; - gint i; - gdouble dinc; - - cc->num_colors = GDK_VISUAL_XVISUAL (cc->visual)->map_entries; - - cc->clut = g_new (gulong, cc->num_colors); - cstart = g_new (GdkColor, cc->num_colors); - - retrygray: - - dinc = 65535.0 / (cc->num_colors - 1); - - clrs = cstart; - - for (i = 0; i < cc->num_colors; i++) - { - clrs->red = clrs->green = clrs->blue = dinc * i; - - if (!gdk_color_alloc (cc->colormap, clrs)) - { - gdk_colors_free (cc->colormap, cc->clut, i, 0); - - cc->num_colors /= 2; - - if (cc->num_colors > 1) - goto retrygray; - else - { - g_free (cc->clut); - cc->clut = NULL; - init_bw (cc); - g_free (cstart); - return; - } - } - - cc->clut[i] = clrs++->pixel; - } - - g_free (cstart); - - /* XXX: is this the right thing to do? */ - ccp->std_cmap.colormap = GDK_COLORMAP_XCOLORMAP (cc->colormap); - ccp->std_cmap.base_pixel = 0; - ccp->std_cmap.red_max = cc->num_colors - 1; - ccp->std_cmap.green_max = 0; - ccp->std_cmap.blue_max = 0; - ccp->std_cmap.red_mult = 1; - ccp->std_cmap.green_mult = 0; - ccp->std_cmap.blue_mult = 0; - - cc->white_pixel = WhitePixel (ccp->xdisplay, gdk_screen); - cc->black_pixel = BlackPixel (ccp->xdisplay, gdk_screen); - - query_colors (cc); - - cc->mode = GDK_CC_MODE_MY_GRAY; -} - -static void -init_color (GdkColorContext *cc) -{ - GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc; - gint cubeval; - - cubeval = 1; - while ((cubeval * cubeval * cubeval) < GDK_VISUAL_XVISUAL (cc->visual)->map_entries) - cubeval++; - cubeval--; - - cc->num_colors = cubeval * cubeval * cubeval; - - ccp->std_cmap.red_max = cubeval - 1; - ccp->std_cmap.green_max = cubeval - 1; - ccp->std_cmap.blue_max = cubeval - 1; - ccp->std_cmap.red_mult = cubeval * cubeval; - ccp->std_cmap.green_mult = cubeval; - ccp->std_cmap.blue_mult = 1; - ccp->std_cmap.base_pixel = 0; - - cc->white_pixel = WhitePixel (ccp->xdisplay, gdk_screen); - cc->black_pixel = BlackPixel (ccp->xdisplay, gdk_screen); - cc->num_colors = DisplayCells (ccp->xdisplay, gdk_screen); - - /* a CLUT for storing allocated pixel indices */ - - cc->max_colors = cc->num_colors; - cc->clut = g_new (gulong, cc->max_colors); - - for (cubeval = 0; cubeval < cc->max_colors; cubeval++) - cc->clut[cubeval] = cubeval; - - query_colors (cc); - - cc->mode = GDK_CC_MODE_STD_CMAP; -} - - -static void -init_true_color (GdkColorContext *cc) -{ - GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc; - gulong rmask, gmask, bmask; - - cc->mode = GDK_CC_MODE_TRUE; - - /* Red */ - - rmask = cc->masks.red = cc->visual->red_mask; - - cc->shifts.red = 0; - cc->bits.red = 0; - - while (!(rmask & 1)) - { - rmask >>= 1; - cc->shifts.red++; - } - - while (rmask & 1) - { - rmask >>= 1; - cc->bits.red++; - } - - /* Green */ - - gmask = cc->masks.green = cc->visual->green_mask; - - cc->shifts.green = 0; - cc->bits.green = 0; - - while (!(gmask & 1)) - { - gmask >>= 1; - cc->shifts.green++; - } - - while (gmask & 1) - { - gmask >>= 1; - cc->bits.green++; - } - - /* Blue */ - - bmask = cc->masks.blue = cc->visual->blue_mask; - - cc->shifts.blue = 0; - cc->bits.blue = 0; - - while (!(bmask & 1)) - { - bmask >>= 1; - cc->shifts.blue++; - } - - while (bmask & 1) - { - bmask >>= 1; - cc->bits.blue++; - } - - cc->num_colors = (cc->visual->red_mask | cc->visual->green_mask | cc->visual->blue_mask) + 1; - cc->white_pixel = WhitePixel (ccp->xdisplay, gdk_screen); - cc->black_pixel = BlackPixel (ccp->xdisplay, gdk_screen); -} - -static void -init_direct_color (GdkColorContext *cc) -{ - gint n, count; - GdkColor *clrs, *cstart; - gulong rval, gval, bval; - gulong *rtable; - gulong *gtable; - gulong *btable; - gdouble dinc; - - init_true_color (cc); /* for shift stuff */ - - rval = cc->visual->red_mask >> cc->shifts.red; - gval = cc->visual->green_mask >> cc->shifts.green; - bval = cc->visual->blue_mask >> cc->shifts.blue; - - rtable = g_new (gulong, rval + 1); - gtable = g_new (gulong, gval + 1); - btable = g_new (gulong, bval + 1); - - cc->max_entry = MAX (rval, gval); - cc->max_entry = MAX (cc->max_entry, bval); - - cstart = g_new (GdkColor, cc->max_entry + 1); - cc->clut = g_new (gulong, cc->max_entry + 1); - - retrydirect: - - for (n = 0; n < rval; n++) - rtable[n] = rval ? (65535.0 / rval * n) : 0; - - for (n = 0; n < gval; n++) - gtable[n] = gval ? (65535.0 / gval * n) : 0; - - for (n = 0; n < bval; n++) - btable[n] = bval ? (65535.0 / bval * n) : 0; - - cc->max_entry = MAX (rval, gval); - cc->max_entry = MAX (cc->max_entry, bval); - - count = 0; - clrs = cstart; - cc->num_colors = (rval + 1) * (gval + 1) * (bval + 1); - - for (n = 0; n < cc->max_entry; n++) - { - dinc = (double) n / cc->max_entry; - - clrs->red = rtable[(int) (dinc * rval)]; - clrs->green = gtable[(int) (dinc * gval)]; - clrs->blue = btable[(int) (dinc * bval)]; - - if (gdk_color_alloc (cc->colormap, clrs)) - { - cc->clut[count++] = clrs->pixel; - clrs++; - } - else - { - gdk_colors_free (cc->colormap, cc->clut, count, 0); - - rval >>= 1; - gval >>= 1; - bval >>= 1; - - cc->masks.red = (cc->masks.red >> 1) & cc->visual->red_mask; - cc->masks.green = (cc->masks.green >> 1) & cc->visual->green_mask; - cc->masks.blue = (cc->masks.blue >> 1) & cc->visual->blue_mask; - - cc->shifts.red++; - cc->shifts.green++; - cc->shifts.blue++; - - cc->bits.red--; - cc->bits.green--; - cc->bits.blue--; - - cc->num_colors = (rval + 1) * (gval + 1) * (bval + 1); - - if (cc->num_colors >1) - goto retrydirect; - else - { - g_free (cc->clut); - cc->clut = NULL; - init_bw (cc); - break; - } - } - } - - /* Update allocated color count; original num_colors is max_entry, which - * is not necessarily the same as the really allocated number of colors. - */ - - cc->num_colors = count; - - g_free (rtable); - g_free (gtable); - g_free (btable); - g_free (cstart); -} - -static void -init_palette (GdkColorContext *cc) -{ - /* restore correct mode for this cc */ - - switch (cc->visual->type) - { - case GDK_VISUAL_STATIC_GRAY: - case GDK_VISUAL_GRAYSCALE: - if (GDK_VISUAL_XVISUAL (cc->visual)->map_entries == 2) - cc->mode = GDK_CC_MODE_BW; - else - cc->mode = GDK_CC_MODE_MY_GRAY; - break; - - case GDK_VISUAL_TRUE_COLOR: - case GDK_VISUAL_DIRECT_COLOR: - cc->mode = GDK_CC_MODE_TRUE; - break; - - case GDK_VISUAL_STATIC_COLOR: - case GDK_VISUAL_PSEUDO_COLOR: - cc->mode = GDK_CC_MODE_STD_CMAP; - break; - - default: - cc->mode = GDK_CC_MODE_UNDEFINED; - break; - } - - /* previous palette */ - - if (cc->num_palette) - g_free (cc->palette); - - if (cc->fast_dither) - g_free (cc->fast_dither); - - /* clear hash table if present */ - - if (cc->color_hash) - { - g_hash_table_foreach (cc->color_hash, - free_hash_entry, - NULL); - g_hash_table_destroy (cc->color_hash); - cc->color_hash = NULL; - } - - cc->palette = NULL; - cc->num_palette = 0; - cc->fast_dither = NULL; -} - -GdkColorContext * -gdk_color_context_new (GdkVisual *visual, - GdkColormap *colormap) -{ - GdkColorContextPrivate *ccp; - gint use_private_colormap = FALSE; /* XXX: maybe restore full functionality later? */ - GdkColorContext *cc; - gint retry_count; - GdkColormap *default_colormap; - - g_assert (visual != NULL); - g_assert (colormap != NULL); - - ccp = g_new (GdkColorContextPrivate, 1); - cc = (GdkColorContext *) ccp; - ccp->xdisplay = gdk_display; - cc->visual = visual; - cc->colormap = colormap; - cc->clut = NULL; - cc->cmap = NULL; - cc->mode = GDK_CC_MODE_UNDEFINED; - cc->need_to_free_colormap = FALSE; - - cc->color_hash = NULL; - cc->palette = NULL; - cc->num_palette = 0; - cc->fast_dither = NULL; - - default_colormap = gdk_colormap_get_system (); - - retry_count = 0; - - while (retry_count < 2) - { - /* Only create a private colormap if the visual found isn't equal - * to the default visual and we don't have a private colormap, - * -or- if we are instructed to create a private colormap (which - * never is the case for XmHTML). - */ - - if (use_private_colormap - || ((cc->visual != gdk_visual_get_system ()) /* default visual? */ - && (GDK_COLORMAP_XCOLORMAP (colormap) == GDK_COLORMAP_XCOLORMAP (default_colormap)))) - { - g_warning ("gdk_color_context_new: non-default visual detected, " - "using private colormap"); - - cc->colormap = gdk_colormap_new (cc->visual, FALSE); - - cc->need_to_free_colormap = (GDK_COLORMAP_XCOLORMAP (colormap) - != GDK_COLORMAP_XCOLORMAP (default_colormap)); - } - - switch (visual->type) - { - case GDK_VISUAL_STATIC_GRAY: - case GDK_VISUAL_GRAYSCALE: - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_new: visual class is %s\n", - (visual->type == GDK_VISUAL_STATIC_GRAY) ? - "GDK_VISUAL_STATIC_GRAY" : - "GDK_VISUAL_GRAYSCALE")); - - if (GDK_VISUAL_XVISUAL (cc->visual)->map_entries == 2) - init_bw (cc); - else - init_gray (cc); - - break; - - case GDK_VISUAL_TRUE_COLOR: /* shifts */ - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_new: visual class is GDK_VISUAL_TRUE_COLOR\n")); - - init_true_color (cc); - break; - - case GDK_VISUAL_DIRECT_COLOR: /* shifts and fake CLUT */ - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_new: visual class is GDK_VISUAL_DIRECT_COLOR\n")); - - init_direct_color (cc); - break; - - case GDK_VISUAL_STATIC_COLOR: - case GDK_VISUAL_PSEUDO_COLOR: - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_new: visual class is %s\n", - (visual->type == GDK_VISUAL_STATIC_COLOR) ? - "GDK_VISUAL_STATIC_COLOR" : - "GDK_VISUAL_PSEUDO_COLOR")); - - init_color (cc); - break; - - default: - g_assert_not_reached (); - } - - if ((cc->mode == GDK_CC_MODE_BW) && (cc->visual->depth > 1)) - { - use_private_colormap = TRUE; - retry_count++; - } - else - break; - } - - /* no. of colors allocated yet */ - - cc->num_allocated = 0; - - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_new: screen depth is %i, no. of colors is %i\n", - cc->visual->depth, cc->num_colors)); - - return (GdkColorContext *) cc; -} - -GdkColorContext * -gdk_color_context_new_mono (GdkVisual *visual, - GdkColormap *colormap) -{ - GdkColorContextPrivate *ccp; - GdkColorContext *cc; - - g_assert (visual != NULL); - g_assert (colormap != NULL); - - cc = g_new (GdkColorContext, 1); - ccp = (GdkColorContextPrivate *) cc; - ccp->xdisplay = gdk_display; - cc->visual = visual; - cc->colormap = colormap; - cc->clut = NULL; - cc->cmap = NULL; - cc->mode = GDK_CC_MODE_UNDEFINED; - cc->need_to_free_colormap = FALSE; - - init_bw (cc); - - return (GdkColorContext *) cc; -} - -/* This doesn't currently free black/white, hmm... */ - -void -gdk_color_context_free (GdkColorContext *cc) -{ - g_assert (cc != NULL); - - if ((cc->visual->type == GDK_VISUAL_STATIC_COLOR) - || (cc->visual->type == GDK_VISUAL_PSEUDO_COLOR)) - { - gdk_colors_free (cc->colormap, cc->clut, cc->num_allocated, 0); - g_free (cc->clut); - } - else if (cc->clut != NULL) - { - gdk_colors_free (cc->colormap, cc->clut, cc->num_colors, 0); - g_free (cc->clut); - } - - if (cc->cmap != NULL) - g_free (cc->cmap); - - if (cc->need_to_free_colormap) - gdk_colormap_unref (cc->colormap); - - /* free any palette that has been associated with this GdkColorContext */ - - init_palette (cc); - - g_free (cc); -} - -gulong -gdk_color_context_get_pixel (GdkColorContext *cc, - gushort red, - gushort green, - gushort blue, - gint *failed) -{ - GdkColorContextPrivate *ccp = (GdkColorContextPrivate *) cc; - g_assert (cc != NULL); - g_assert (failed != NULL); - - *failed = FALSE; - - switch (cc->mode) - { - case GDK_CC_MODE_BW: - { - gdouble value; - - value = (red / 65535.0 * 0.30 - + green / 65535.0 * 0.59 - + blue / 65535.0 * 0.11); - - if (value > 0.5) - return cc->white_pixel; - - return cc->black_pixel; - } - - case GDK_CC_MODE_MY_GRAY: - { - gulong ired, igreen, iblue; - - red = red * 0.30 + green * 0.59 + blue * 0.11; - green = 0; - blue = 0; - - if ((ired = red * (ccp->std_cmap.red_max + 1) / 0xffff) > ccp->std_cmap.red_max) - ired = ccp->std_cmap.red_max; - - ired *= ccp->std_cmap.red_mult; - - if ((igreen = green * (ccp->std_cmap.green_max + 1) / 0xffff) > ccp->std_cmap.green_max) - igreen = ccp->std_cmap.green_max; - - igreen *= ccp->std_cmap.green_mult; - - if ((iblue = blue * (ccp->std_cmap.blue_max + 1) / 0xffff) > ccp->std_cmap.blue_max) - iblue = ccp->std_cmap.blue_max; - - iblue *= ccp->std_cmap.blue_mult; - - if (cc->clut != NULL) - return cc->clut[ccp->std_cmap.base_pixel + ired + igreen + iblue]; - - return ccp->std_cmap.base_pixel + ired + igreen + iblue; - } - - case GDK_CC_MODE_TRUE: - { - gulong ired, igreen, iblue; - - if (cc->clut == NULL) - { - red >>= 16 - cc->bits.red; - green >>= 16 - cc->bits.green; - blue >>= 16 - cc->bits.blue; - - ired = (red << cc->shifts.red) & cc->masks.red; - igreen = (green << cc->shifts.green) & cc->masks.green; - iblue = (blue << cc->shifts.blue) & cc->masks.blue; - - return ired | igreen | iblue; - } - - ired = cc->clut[red * cc->max_entry / 65535] & cc->masks.red; - igreen = cc->clut[green * cc->max_entry / 65535] & cc->masks.green; - iblue = cc->clut[blue * cc->max_entry / 65535] & cc->masks.blue; - - return ired | igreen | iblue; - } - - case GDK_CC_MODE_PALETTE: - return gdk_color_context_get_pixel_from_palette (cc, &red, &green, &blue, failed); - - case GDK_CC_MODE_STD_CMAP: - default: - { - GdkColor color; - GdkColor *result = NULL; - - color.red = red; - color.green = green; - color.blue = blue; - - if (cc->color_hash) - result = g_hash_table_lookup (cc->color_hash, &color); - - if (!result) - { - color.red = red; - color.green = green; - color.blue = blue; - color.pixel = 0; - - if (!gdk_color_alloc (cc->colormap, &color)) - *failed = TRUE; - else - { - GdkColor *cnew; - - /* XXX: the following comment comes directly from - * XCC.c. I don't know if it is relevant for - * gdk_color_alloc() as it is for XAllocColor() - * - Federico - */ - /* - * I can't figure this out entirely, but it *is* possible - * that XAllocColor succeeds, even if the number of - * allocations we've made exceeds the number of available - * colors in the current colormap. And therefore it - * might be necessary for us to resize the CLUT. - */ - - if (cc->num_allocated == cc->max_colors) - { - cc->max_colors *= 2; - - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixel: " - "resizing CLUT to %i entries\n", - cc->max_colors)); - - cc->clut = g_realloc (cc->clut, - cc->max_colors * sizeof (gulong)); - } - - /* Key and value are the same color structure */ - - cnew = g_new (GdkColor, 1); - *cnew = color; - - if (!cc->color_hash) - cc->color_hash = g_hash_table_new (hash_color, compare_colors); - g_hash_table_insert (cc->color_hash, cnew, cnew); - - cc->clut[cc->num_allocated] = color.pixel; - cc->num_allocated++; - return color.pixel; - } - } - - return result->pixel; - } - } -} - -void -gdk_color_context_get_pixels (GdkColorContext *cc, - gushort *reds, - gushort *greens, - gushort *blues, - gint ncolors, - gulong *colors, - gint *nallocated) -{ - gint i, k, idx; - gint cmapsize, ncols = 0, nopen = 0, counter = 0; - gint bad_alloc = FALSE; - gint failed[MAX_IMAGE_COLORS], allocated[MAX_IMAGE_COLORS]; - GdkColor defs[MAX_IMAGE_COLORS], cmap[MAX_IMAGE_COLORS]; -#ifdef G_ENABLE_DEBUG - gint exact_col = 0, subst_col = 0, close_col = 0, black_col = 0; -#endif - g_assert (cc != NULL); - g_assert (reds != NULL); - g_assert (greens != NULL); - g_assert (blues != NULL); - g_assert (colors != NULL); - g_assert (nallocated != NULL); - - memset (defs, 0, MAX_IMAGE_COLORS * sizeof (GdkColor)); - memset (failed, 0, MAX_IMAGE_COLORS * sizeof (gint)); - memset (allocated, 0, MAX_IMAGE_COLORS * sizeof (gint)); - - /* Will only have a value if used by the progressive image loader */ - - ncols = *nallocated; - - *nallocated = 0; - - /* First allocate all pixels */ - - for (i = 0; i < ncolors; i++) - { - /* colors[i] is only zero if the pixel at that location hasn't - * been allocated yet. This is a sanity check required for proper - * color allocation by the progressive image loader - */ - - if (colors[i] == 0) - { - defs[i].red = reds[i]; - defs[i].green = greens[i]; - defs[i].blue = blues[i]; - - colors[i] = gdk_color_context_get_pixel (cc, reds[i], greens[i], blues[i], - &bad_alloc); - - /* successfully allocated, store it */ - - if (!bad_alloc) - { - defs[i].pixel = colors[i]; - allocated[ncols++] = colors[i]; - } - else - failed[nopen++] = i; - } - } - - *nallocated = ncols; - - /* all colors available, all done */ - - if ((ncols == ncolors) || (nopen == 0)) - { - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels: got all %i colors; " - "(%i colors allocated so far)\n", ncolors, cc->num_allocated)); - - return; - } - - /* The fun part. We now try to allocate the colors we couldn't allocate - * directly. The first step will map a color onto its nearest color - * that has been allocated (either by us or someone else). If any colors - * remain unallocated, we map these onto the colors that we have allocated - * ourselves. - */ - - /* read up to MAX_IMAGE_COLORS colors of the current colormap */ - - cmapsize = MIN (cc->num_colors, MAX_IMAGE_COLORS); - - /* see if the colormap has any colors to read */ - - if (cmapsize < 0) - { - g_warning ("gdk_color_context_get_pixels: oops! no colors available, " - "your images will look *really* ugly."); - - return; - } - -#ifdef G_ENABLE_DEBUG - exact_col = ncols; -#endif - - /* initialize pixels */ - - for (i = 0; i < cmapsize; i++) - { - cmap[i].pixel = i; - cmap[i].red = cmap[i].green = cmap[i].blue = 0; - } - - /* read the colormap */ - - my_x_query_colors (cc->colormap, cmap, cmapsize); - - /* get a close match for any unallocated colors */ - - counter = nopen; - nopen = 0; - idx = 0; - - do - { - gint d, j, mdist, close, ri, gi, bi; - gint rd, gd, bd; - - i = failed[idx]; - - mdist = 0x1000000; - close = -1; - - /* Store these vals. Small performance increase as this skips three - * indexing operations in the loop code. - */ - - ri = reds[i]; - gi = greens[i]; - bi = blues[i]; - - /* Walk all colors in the colormap and see which one is the - * closest. Uses plain least squares. - */ - - for (j = 0; (j < cmapsize) && (mdist != 0); j++) - { - /* Don't replace these by shifts; the sign may get clobbered */ - - rd = (ri - cmap[j].red) / 256; - gd = (gi - cmap[j].green) / 256; - bd = (bi - cmap[j].blue) / 256; - - d = rd * rd + gd * gd + bd * bd; - - if (d < mdist) - { - close = j; - mdist = d; - } - } - - if (close != -1) - { - rd = cmap[close].red; - gd = cmap[close].green; - bd = cmap[close].blue; - - /* allocate */ - - colors[i] = gdk_color_context_get_pixel (cc, rd, gd, bd, &bad_alloc); - - /* store */ - - if (!bad_alloc) - { - defs[i] = cmap[close]; - defs[i].pixel = colors[i]; - allocated[ncols++] = colors[i]; -#ifdef G_ENABLE_DEBUG - close_col++; -#endif - } else - failed[nopen++] = i; - } else - failed[nopen++] = i; - /* deal with in next stage if allocation failed */ - } - while (++idx < counter); - - *nallocated = ncols; - - /* This is the maximum no. of allocated colors. See also the nopen == 0 - * note above. - */ - - if ((ncols == ncolors) || (nopen == 0)) - { - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels: got %i colors, %i exact and " - "%i close (%i colors allocated so far)\n", - ncolors, exact_col, close_col, cc->num_allocated)); - - return; - } - - /* Now map any remaining unallocated pixels into the colors we did get */ - - idx = 0; - - do - { - gint d, mdist, close, ri, gi, bi; - gint j, rd, gd, bd; - - i = failed[idx]; - - mdist = 0x1000000; - close = -1; - - /* store */ - - ri = reds[i]; - gi = greens[i]; - bi = blues[i]; - - /* search allocated colors */ - - for (j = 0; (j < ncols) && (mdist != 0); j++) - { - k = allocated[j]; - - /* Don't replace these by shifts; the sign may get clobbered */ - - rd = (ri - defs[k].red) / 256; - gd = (gi - defs[k].green) / 256; - bd = (bi - defs[k].blue) / 256; - - d = rd * rd + gd * gd + bd * bd; - - if (d < mdist) - { - close = k; - mdist = d; - } - } - - if (close < 0) - { - /* too bad, map to black */ - - defs[i].pixel = cc->black_pixel; - defs[i].red = defs[i].green = defs[i].blue = 0; -#ifdef G_ENABLE_DEBUG - black_col++; -#endif - } - else - { - defs[i] = defs[close]; -#ifdef G_ENABLE_DEBUG - subst_col++; -#endif - } - - colors[i] = defs[i].pixel; - } - while (++idx < nopen); - - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels: got %i colors, %i exact, %i close, " - "%i substituted, %i to black (%i colors allocated so far)\n", - ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated)); -} - -void -gdk_color_context_get_pixels_incremental (GdkColorContext *cc, - gushort *reds, - gushort *greens, - gushort *blues, - gint ncolors, - gint *used, - gulong *colors, - gint *nallocated) -{ - gint i, k, idx; - gint cmapsize, ncols = 0, nopen = 0, counter = 0; - gint bad_alloc = FALSE; - gint failed[MAX_IMAGE_COLORS], allocated[MAX_IMAGE_COLORS]; - GdkColor defs[MAX_IMAGE_COLORS], cmap[MAX_IMAGE_COLORS]; -#ifdef G_ENABLE_DEBUG - gint exact_col = 0, subst_col = 0, close_col = 0, black_col = 0; -#endif - - g_assert (cc != NULL); - g_assert (reds != NULL); - g_assert (greens != NULL); - g_assert (blues != NULL); - g_assert (used != NULL); - g_assert (colors != NULL); - g_assert (nallocated != NULL); - - memset (defs, 0, MAX_IMAGE_COLORS * sizeof (GdkColor)); - memset (failed, 0, MAX_IMAGE_COLORS * sizeof (gint)); - memset (allocated, 0, MAX_IMAGE_COLORS * sizeof (gint)); - - /* Will only have a value if used by the progressive image loader */ - - ncols = *nallocated; - - *nallocated = 0; - - /* First allocate all pixels */ - - for (i = 0; i < ncolors; i++) - { - /* used[i] is only -1 if the pixel at that location hasn't - * been allocated yet. This is a sanity check required for proper - * color allocation by the progressive image loader. - * When colors[i] == 0 it indicates the slot is available for - * allocation. - */ - - if (used[i] != FALSE) - { - if (colors[i] == 0) - { - defs[i].red = reds[i]; - defs[i].green = greens[i]; - defs[i].blue = blues[i]; - - colors[i] = gdk_color_context_get_pixel (cc, reds[i], greens[i], blues[i], &bad_alloc); - - /* successfully allocated, store it */ - - if (!bad_alloc) - { - defs[i].pixel = colors[i]; - allocated[ncols++] = colors[i]; - } - else - failed[nopen++] = i; - } -#ifdef DEBUG - else - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels_incremental: " - "pixel at slot %i already allocated, skipping\n", i)); -#endif - } - } - - *nallocated = ncols; - - if ((ncols == ncolors) || (nopen == 0)) - { - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels_incremental: got all %i colors " - "(%i colors allocated so far)\n", - ncolors, cc->num_allocated)); - - return; - } - - cmapsize = MIN (cc->num_colors, MAX_IMAGE_COLORS); - - if (cmapsize < 0) - { - g_warning ("gdk_color_context_get_pixels_incremental: oops! " - "No colors available images will look *really* ugly."); - return; - } - -#ifdef G_ENABLE_DEBUG - exact_col = ncols; -#endif - - /* initialize pixels */ - - for (i = 0; i < cmapsize; i++) - { - cmap[i].pixel = i; - cmap[i].red = cmap[i].green = cmap[i].blue = 0; - } - - /* read */ - - my_x_query_colors (cc->colormap, cmap, cmapsize); - - /* now match any unallocated colors */ - - counter = nopen; - nopen = 0; - idx = 0; - - do - { - gint d, j, mdist, close, ri, gi, bi; - gint rd, gd, bd; - - i = failed[idx]; - - mdist = 0x1000000; - close = -1; - - /* store */ - - ri = reds[i]; - gi = greens[i]; - bi = blues[i]; - - for (j = 0; (j < cmapsize) && (mdist != 0); j++) - { - /* Don't replace these by shifts; the sign may get clobbered */ - - rd = (ri - cmap[j].red) / 256; - gd = (gi - cmap[j].green) / 256; - bd = (bi - cmap[j].blue) / 256; - - d = rd * rd + gd * gd + bd * bd; - - if (d < mdist) - { - close = j; - mdist = d; - } - } - - if (close != -1) - { - rd = cmap[close].red; - gd = cmap[close].green; - bd = cmap[close].blue; - - /* allocate */ - - colors[i] = gdk_color_context_get_pixel (cc, rd, gd, bd, &bad_alloc); - - /* store */ - - if (!bad_alloc) - { - defs[i] = cmap[close]; - defs[i].pixel = colors[i]; - allocated[ncols++] = colors[i]; -#ifdef G_ENABLE_DEBUG - close_col++; -#endif - } - else - failed[nopen++] = i; - } - else - failed[nopen++] = i; - /* deal with in next stage if allocation failed */ - } - while (++idx < counter); - - *nallocated = ncols; - - if ((ncols == ncolors) || (nopen == 0)) - { - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels_incremental: " - "got %i colors, %i exact and %i close " - "(%i colors allocated so far)\n", - ncolors, exact_col, close_col, cc->num_allocated)); - - return; - } - - /* map remaining unallocated pixels into colors we did get */ - - idx = 0; - - do - { - gint d, mdist, close, ri, gi, bi; - gint j, rd, gd, bd; - - i = failed[idx]; - - mdist = 0x1000000; - close = -1; - - ri = reds[i]; - gi = greens[i]; - bi = blues[i]; - - /* search allocated colors */ - - for (j = 0; (j < ncols) && (mdist != 0); j++) - { - k = allocated[j]; - - /* downscale */ - /* Don't replace these by shifts; the sign may get clobbered */ - - rd = (ri - defs[k].red) / 256; - gd = (gi - defs[k].green) / 256; - bd = (bi - defs[k].blue) / 256; - - d = rd * rd + gd * gd + bd * bd; - - if (d < mdist) - { - close = k; - mdist = d; - } - } - - if (close < 0) - { - /* too bad, map to black */ - - defs[i].pixel = cc->black_pixel; - defs[i].red = defs[i].green = defs[i].blue = 0; -#ifdef G_ENABLE_DEBUG - black_col++; -#endif - } - else - { - defs[i] = defs[close]; -#ifdef G_ENABLE_DEBUG - subst_col++; -#endif - } - - colors[i] = defs[i].pixel; - } - while (++idx < nopen); - - GDK_NOTE (COLOR_CONTEXT, - g_message ("gdk_color_context_get_pixels_incremental: " - "got %i colors, %i exact, %i close, %i substituted, %i to black " - "(%i colors allocated so far)\n", - ncolors, exact_col, close_col, subst_col, black_col, cc->num_allocated)); -} - -gint -gdk_color_context_query_color (GdkColorContext *cc, - GdkColor *color) -{ - return gdk_color_context_query_colors (cc, color, 1); -} - -gint -gdk_color_context_query_colors (GdkColorContext *cc, - GdkColor *colors, - gint num_colors) -{ - gint i; - GdkColor *tc; - - g_assert (cc != NULL); - g_assert (colors != NULL); - - switch (cc->mode) - { - case GDK_CC_MODE_BW: - for (i = 0, tc = colors; i < num_colors; i++, tc++) - { - if (tc->pixel == cc->white_pixel) - tc->red = tc->green = tc->blue = 65535; - else - tc->red = tc->green = tc->blue = 0; - } - break; - - case GDK_CC_MODE_TRUE: - if (cc->clut == NULL) - for (i = 0, tc = colors; i < num_colors; i++, tc++) - { - tc->red = ((tc->pixel & cc->masks.red) >> cc->shifts.red) << (16 - cc->bits.red); - tc->green = ((tc->pixel & cc->masks.green) >> cc->shifts.green) << (16 - cc->bits.green); - tc->blue = ((tc->pixel & cc->masks.blue) >> cc->shifts.blue) << (16 - cc->bits.blue); - } - else - { - my_x_query_colors (cc->colormap, colors, num_colors); - return 1; - } - break; - - case GDK_CC_MODE_STD_CMAP: - default: - if (cc->cmap == NULL) - { - my_x_query_colors (cc->colormap, colors, num_colors); - return 1; - } - else - { - gint first, last, half; - gulong half_pixel; - - for (i = 0, tc = colors; i < num_colors; i++) - { - first = 0; - last = cc->num_colors - 1; - - while (first <= last) - { - half = (first + last) / 2; - half_pixel = cc->cmap[half].pixel; - - if (tc->pixel == half_pixel) - { - tc->red = cc->cmap[half].red; - tc->green = cc->cmap[half].green; - tc->blue = cc->cmap[half].blue; - first = last + 1; /* false break */ - } - else - { - if (tc->pixel > half_pixel) - first = half + 1; - else - last = half - 1; - } - } - } - return 1; - } - break; - } - return 1; -} - -gint -gdk_color_context_add_palette (GdkColorContext *cc, - GdkColor *palette, - gint num_palette) -{ - gint i, j, erg; - gushort r, g, b; - gulong pixel[1]; - - g_assert (cc != NULL); - - /* initialize this palette (will also erase previous palette as well) */ - - init_palette (cc); - - /* restore previous mode if we aren't adding a new palette */ - - if (num_palette == 0) - return 0; - - /* copy incoming palette */ - - cc->palette = g_new0(GdkColor, num_palette); - - j = 0; - - for (i = 0; i < num_palette; i++) - { - erg = 0; - pixel[0] = 0; - - /* try to allocate this color */ - - r = palette[i].red; - g = palette[i].green; - b = palette[i].blue; - - gdk_color_context_get_pixels (cc, &r, &g, &b, 1, pixel, &erg); - - /* only store if we succeed */ - - if (erg) - { - /* store in palette */ - - cc->palette[j].red = r; - cc->palette[j].green = g; - cc->palette[j].blue = b; - cc->palette[j].pixel = pixel[0]; - - /* move to next slot */ - - j++; - } - } - - /* resize to fit */ - - if (j != num_palette) - cc->palette = g_realloc (cc->palette, j * sizeof (GdkColor)); - - /* clear the hash table, we don't use it when dithering */ - - if (cc->color_hash) - { - g_hash_table_foreach (cc->color_hash, - free_hash_entry, - NULL); - g_hash_table_destroy (cc->color_hash); - cc->color_hash = NULL; - } - - /* store real palette size */ - - cc->num_palette = j; - - /* switch to palette mode */ - - cc->mode = GDK_CC_MODE_PALETTE; - - /* sort palette */ - - qsort (cc->palette, cc->num_palette, sizeof (GdkColor), pixel_sort); - - cc->fast_dither = NULL; - - return j; -} - -void -gdk_color_context_init_dither (GdkColorContext *cc) -{ - gint rr, gg, bb, err, erg, erb; - gint success = FALSE; - - g_assert (cc != NULL); - - /* now we can initialize the fast dither matrix */ - - if (cc->fast_dither == NULL) - cc->fast_dither = g_new (GdkColorContextDither, 1); - - /* Fill it. We ignore unsuccessful allocations, they are just mapped - * to black instead */ - - for (rr = 0; rr < 32; rr++) - for (gg = 0; gg < 32; gg++) - for (bb = 0; bb < 32; bb++) - { - err = (rr << 3) | (rr >> 2); - erg = (gg << 3) | (gg >> 2); - erb = (bb << 3) | (bb >> 2); - - cc->fast_dither->fast_rgb[rr][gg][bb] = - gdk_color_context_get_index_from_palette (cc, &err, &erg, &erb, &success); - cc->fast_dither->fast_err[rr][gg][bb] = err; - cc->fast_dither->fast_erg[rr][gg][bb] = erg; - cc->fast_dither->fast_erb[rr][gg][bb] = erb; - } -} - -void -gdk_color_context_free_dither (GdkColorContext *cc) -{ - g_assert (cc != NULL); - - if (cc->fast_dither) - g_free (cc->fast_dither); - - cc->fast_dither = NULL; -} - -gulong -gdk_color_context_get_pixel_from_palette (GdkColorContext *cc, - gushort *red, - gushort *green, - gushort *blue, - gint *failed) -{ - gulong pixel = 0; - gint dif, dr, dg, db, j = -1; - gint mindif = 0x7fffffff; - gint err = 0, erg = 0, erb = 0; - gint i; - - g_assert (cc != NULL); - g_assert (red != NULL); - g_assert (green != NULL); - g_assert (blue != NULL); - g_assert (failed != NULL); - - *failed = FALSE; - - for (i = 0; i < cc->num_palette; i++) - { - dr = *red - cc->palette[i].red; - dg = *green - cc->palette[i].green; - db = *blue - cc->palette[i].blue; - - dif = dr * dr + dg * dg + db * db; - - if (dif < mindif) - { - mindif = dif; - j = i; - pixel = cc->palette[i].pixel; - err = dr; - erg = dg; - erb = db; - - if (mindif == 0) - break; - } - } - - /* we failed to map onto a color */ - - if (j == -1) - *failed = TRUE; - else - { - *red = ABS (err); - *green = ABS (erg); - *blue = ABS (erb); - } - - return pixel; -} - -guchar -gdk_color_context_get_index_from_palette (GdkColorContext *cc, - gint *red, - gint *green, - gint *blue, - gint *failed) -{ - gint dif, dr, dg, db, j = -1; - gint mindif = 0x7fffffff; - gint err = 0, erg = 0, erb = 0; - gint i; - - g_assert (cc != NULL); - g_assert (red != NULL); - g_assert (green != NULL); - g_assert (blue != NULL); - g_assert (failed != NULL); - - *failed = FALSE; - - for (i = 0; i < cc->num_palette; i++) - { - dr = *red - cc->palette[i].red; - dg = *green - cc->palette[i].green; - db = *blue - cc->palette[i].blue; - - dif = dr * dr + dg * dg + db * db; - - if (dif < mindif) - { - mindif = dif; - j = i; - err = dr; - erg = dg; - erb = db; - - if (mindif == 0) - break; - } - } - - /* we failed to map onto a color */ - - if (j == -1) - { - *failed = TRUE; - j = 0; - } - else - { - /* return error fractions */ - - *red = err; - *green = erg; - *blue = erb; - } - - return j; -} diff --git a/gtk/gtkbin.c b/gtk/gtkbin.c index 8d3e92462..ecaff82ab 100644 --- a/gtk/gtkbin.c +++ b/gtk/gtkbin.c @@ -189,7 +189,18 @@ gtk_bin_add (GtkContainer *container, g_return_if_fail (GTK_IS_WIDGET (child)); bin = GTK_BIN (container); - g_return_if_fail (bin->child == NULL); + + if (bin->child != NULL) + { + g_warning ("Attempting to add a widget with type %s to a %s, " + "but as a GtkBin subclass a %s can only contain one widget at a time; " + "it already contains a widget of type %s", + g_type_name (G_TYPE_FROM_INSTANCE (child)), + g_type_name (G_TYPE_FROM_INSTANCE (bin)), + g_type_name (G_TYPE_FROM_INSTANCE (bin)), + g_type_name (G_TYPE_FROM_INSTANCE (bin->child))); + return; + } gtk_widget_set_parent (child, GTK_WIDGET (bin)); bin->child = child; diff --git a/gtk/gtkpixmap.c b/gtk/gtkpixmap.c index a258b21b1..37b7c4d77 100644 --- a/gtk/gtkpixmap.c +++ b/gtk/gtkpixmap.c @@ -261,98 +261,43 @@ gtk_pixmap_set_build_insensitive (GtkPixmap *pixmap, guint build) static void build_insensitive_pixmap(GtkPixmap *gtkpixmap) { - GdkGC *gc; GdkPixmap *pixmap = gtkpixmap->pixmap; GdkPixmap *insensitive; - gint w, h, x, y; - GdkGCValues vals; - GdkVisual *visual; - GdkImage *image; - GdkColorContext *cc; - GdkColor color; - GdkColormap *cmap; - gint32 red, green, blue; - GtkStyle *style; - GtkWidget *window; - GdkColor c; - int failed; - - window = GTK_WIDGET (gtkpixmap); - - g_return_if_fail(window != NULL); - - gdk_window_get_size(pixmap, &w, &h); - image = gdk_image_get(pixmap, 0, 0, w, h); - insensitive = gdk_pixmap_new(GTK_WIDGET (gtkpixmap)->window, w, h, -1); - gc = gdk_gc_new (pixmap); - - visual = gtk_widget_get_visual(GTK_WIDGET(gtkpixmap)); - cmap = gtk_widget_get_colormap(GTK_WIDGET(gtkpixmap)); - cc = gdk_color_context_new(visual, cmap); - - if ((cc->mode != GDK_CC_MODE_TRUE) && (cc->mode != GDK_CC_MODE_MY_GRAY)) - { - gdk_draw_image(insensitive, gc, image, 0, 0, 0, 0, w, h); - - style = gtk_widget_get_style(window); - color = style->bg[0]; - gdk_gc_set_foreground (gc, &color); - for (y = 0; y < h; y++) - { - for (x = y % 2; x < w; x += 2) - { - gdk_draw_point(insensitive, gc, x, y); - } - } - } - else - { - gdk_gc_get_values(gc, &vals); - style = gtk_widget_get_style(window); - - color = style->bg[0]; - red = color.red; - green = color.green; - blue = color.blue; - - for (y = 0; y < h; y++) - { - for (x = 0; x < w; x++) - { - c.pixel = gdk_image_get_pixel(image, x, y); - gdk_color_context_query_color(cc, &c); - c.red = (((gint32)c.red - red) >> 1) + red; - c.green = (((gint32)c.green - green) >> 1) + green; - c.blue = (((gint32)c.blue - blue) >> 1) + blue; - c.pixel = gdk_color_context_get_pixel(cc, c.red, c.green, c.blue, - &failed); - gdk_image_put_pixel(image, x, y, c.pixel); - } - } + gint w, h; + GdkPixbuf *pixbuf; + GdkPixbuf *stated; + + gdk_window_get_size (pixmap, &w, &h); + + pixbuf = gdk_pixbuf_get_from_drawable (NULL, + pixmap, + gtk_widget_get_colormap (GTK_WIDGET(gtkpixmap)), + 0, 0, + 0, 0, + w, h); + + stated = gdk_pixbuf_copy (pixbuf); + + gdk_pixbuf_saturate_and_pixelate (pixbuf, stated, + 0.8, TRUE); - for (y = 0; y < h; y++) - { - for (x = y % 2; x < w; x += 2) - { - c.pixel = gdk_image_get_pixel(image, x, y); - gdk_color_context_query_color(cc, &c); - c.red = (((gint32)c.red - red) >> 1) + red; - c.green = (((gint32)c.green - green) >> 1) + green; - c.blue = (((gint32)c.blue - blue) >> 1) + blue; - c.pixel = gdk_color_context_get_pixel(cc, c.red, c.green, c.blue, - &failed); - gdk_image_put_pixel(image, x, y, c.pixel); - } - } + g_object_unref (G_OBJECT (pixbuf)); + pixbuf = NULL; + + insensitive = gdk_pixmap_new (GTK_WIDGET (gtkpixmap)->window, w, h, -1); - gdk_draw_image(insensitive, gc, image, 0, 0, 0, 0, w, h); - } + gdk_pixbuf_render_to_drawable (stated, + insensitive, + GTK_WIDGET (gtkpixmap)->style->white_gc, + 0, 0, + 0, 0, + w, h, + GDK_RGB_DITHER_NORMAL, + 0, 0); gtkpixmap->pixmap_insensitive = insensitive; - gdk_image_destroy(image); - gdk_color_context_free(cc); - gdk_gc_destroy(gc); + g_object_unref (G_OBJECT (stated)); } diff --git a/gtk/testgtk.c b/gtk/testgtk.c index 3c0e461d9..d14d45d7a 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -1988,7 +1988,6 @@ static GtkWidget* create_sensitivity_control (GtkWidget *widget) { GtkWidget *button; - GtkWidget *toplevel; button = gtk_toggle_button_new_with_label ("Sensitive"); @@ -2442,6 +2441,20 @@ create_pixmap (void) gtk_container_add (GTK_CONTAINER (box3), label); gtk_container_add (GTK_CONTAINER (button), box3); + button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0); + + pixmapwid = new_pixmap ("test.xpm", window->window, NULL); + + label = gtk_label_new ("Pixmap\ntest"); + box3 = gtk_hbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (box3), 2); + gtk_container_add (GTK_CONTAINER (box3), pixmapwid); + gtk_container_add (GTK_CONTAINER (box3), label); + gtk_container_add (GTK_CONTAINER (button), box3); + + gtk_widget_set_sensitive (button, FALSE); + separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); diff --git a/tests/testgtk.c b/tests/testgtk.c index 3c0e461d9..d14d45d7a 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -1988,7 +1988,6 @@ static GtkWidget* create_sensitivity_control (GtkWidget *widget) { GtkWidget *button; - GtkWidget *toplevel; button = gtk_toggle_button_new_with_label ("Sensitive"); @@ -2442,6 +2441,20 @@ create_pixmap (void) gtk_container_add (GTK_CONTAINER (box3), label); gtk_container_add (GTK_CONTAINER (button), box3); + button = gtk_button_new (); + gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0); + + pixmapwid = new_pixmap ("test.xpm", window->window, NULL); + + label = gtk_label_new ("Pixmap\ntest"); + box3 = gtk_hbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (box3), 2); + gtk_container_add (GTK_CONTAINER (box3), pixmapwid); + gtk_container_add (GTK_CONTAINER (box3), label); + gtk_container_add (GTK_CONTAINER (button), box3); + + gtk_widget_set_sensitive (button, FALSE); + separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); |