diff options
author | Tim Janik <timj@gtk.org> | 1998-08-18 03:59:41 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-08-18 03:59:41 +0000 |
commit | 7f2909bbab8294c98338ee5512db520c48ced929 (patch) | |
tree | 86bc09d36566944710fc7dd6c1ea5e2cbd59ede9 /gdk/gdkcc.c | |
parent | fdc36ada3f64bb1e9f2afa4c4cfe6c4a56565109 (diff) | |
download | gtk+-7f2909bbab8294c98338ee5512db520c48ced929.tar.gz |
restricted the --g*fatal-* arguments to --g-fatal-warnings again. this
Tue Aug 18 03:54:43 1998 Tim Janik <timj@gtk.org>
* gtk/gtkmain.c (gtk_init): restricted the --g*fatal-* arguments
to --g-fatal-warnings again. this option now causes log levels of
WARNING and CRITICAL to abort().
* gdk/gdk.c:
* gdk/gdkdnd.c:
* gdk/gdkcc.c:
* gdk/gdkfont.c:
* gdk/gdkwindow.c:
* gdk/gdkvisual.c:
* gtk/gtkwidget.c:
* gtk/gtktypeutils.c:
* gtk/gtktree.c:
* gtk/gtkfontsel.c:
* gtk/gtkmain.c:
* gtk/gtkobject.c:
* gtk/gtkpreview.c:
* gtk/gtkselection.c:
* gtk/gtktext.c:
* gtk/gtktree.c:
* gtk/gtktreeitem.c:
did a global search&replace to substitute g_print() calls with
g_message(). libraries shouldn't use printf(), g_print() or
g_printerr() at all.
a bunch of the replacements should probably be wrapped into the
G{D|T}K_NOTE() macros, so they are special cased for debugging
purposes in a sane way, avoiding all the nasty #ifdef DEBUG_MY_TEDDY
things.
* gdk/gdkrgb.c: left this out currently.
* gdk/gdkdnd.c: added copyright notice.
Diffstat (limited to 'gdk/gdkcc.c')
-rw-r--r-- | gdk/gdkcc.c | 954 |
1 files changed, 477 insertions, 477 deletions
diff --git a/gdk/gdkcc.c b/gdk/gdkcc.c index 12631a0772..df7c0a7833 100644 --- a/gdk/gdkcc.c +++ b/gdk/gdkcc.c @@ -69,7 +69,7 @@ static guint hash_color (gconstpointer key) { const GdkColor *color = key; - + return (color->red * 33023 + color->green * 30013 + color->blue * 27011); } @@ -79,7 +79,7 @@ compare_colors (gconstpointer a, { const GdkColor *aa = a; const GdkColor *bb = b; - + return ((aa->red == bb->red) && (aa->green == bb->green) && (aa->blue == bb->blue)); } @@ -108,20 +108,20 @@ my_x_query_colors (GdkColormap *colormap, { 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); } @@ -131,12 +131,12 @@ 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); } @@ -144,25 +144,25 @@ 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; } @@ -173,28 +173,28 @@ init_gray (GdkColorContext *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: - + + 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 @@ -206,12 +206,12 @@ retrygray: 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; @@ -221,12 +221,12 @@ retrygray: 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; } @@ -235,14 +235,14 @@ 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; @@ -250,21 +250,21 @@ init_color (GdkColorContext *cc) 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; } @@ -274,66 +274,66 @@ 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); @@ -349,49 +349,49 @@ init_direct_color (GdkColorContext *cc) 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: - + + 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; @@ -400,25 +400,25 @@ retrydirect: 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 @@ -430,13 +430,13 @@ retrydirect: } } } - + /* 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); @@ -447,7 +447,7 @@ static void init_palette (GdkColorContext *cc) { /* restore correct mode for this cc */ - + switch (cc->visual->type) { case GDK_VISUAL_STATIC_GRAY: @@ -457,40 +457,40 @@ init_palette (GdkColorContext *cc) 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) { /* XXX: quick-and-dirty way to remove everything */ - + g_hash_table_destroy (cc->color_hash); cc->color_hash = g_hash_table_new (hash_color, compare_colors); } - + cc->palette = NULL; cc->num_palette = 0; cc->fast_dither = NULL; @@ -505,10 +505,10 @@ gdk_color_context_new (GdkVisual *visual, 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; @@ -518,16 +518,16 @@ gdk_color_context_new (GdkVisual *visual, 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 @@ -535,66 +535,66 @@ gdk_color_context_new (GdkVisual *visual, * -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_print ("gdk_color_context_new: visual class is %s\n", - (visual->type == GDK_VISUAL_STATIC_GRAY) ? - "GDK_VISUAL_STATIC_GRAY" : - "GDK_VISUAL_GRAYSCALE")); - + 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_print ("gdk_color_context_new: visual class is GDK_VISUAL_TRUE_COLOR\n")); - + 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_print ("gdk_color_context_new: visual class is GDK_VISUAL_DIRECT_COLOR\n")); - + 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_print ("gdk_color_context_new: visual class is %s\n", - (visual->type == GDK_VISUAL_STATIC_COLOR) ? - "GDK_VISUAL_STATIC_COLOR" : - "GDK_VISUAL_PSEUDO_COLOR")); - + 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; @@ -603,20 +603,20 @@ gdk_color_context_new (GdkVisual *visual, else break; } - + /* no. of colors allocated yet */ - + cc->num_allocated = 0; - + GDK_NOTE (COLOR_CONTEXT, - g_print ("gdk_color_context_new: screen depth is %i, no. of colors is %i\n", - cc->visual->depth, cc->num_colors)); - + g_message ("gdk_color_context_new: screen depth is %i, no. of colors is %i\n", + cc->visual->depth, cc->num_colors)); + /* check if we need to initialize a hash table */ - + if ((cc->mode == GDK_CC_MODE_STD_CMAP) || (cc->mode == GDK_CC_MODE_UNDEFINED)) cc->color_hash = g_hash_table_new (hash_color, compare_colors); - + return (GdkColorContext *) cc; } @@ -626,10 +626,10 @@ gdk_color_context_new_mono (GdkVisual *visual, { GdkColorContextPrivate *ccp; GdkColorContext *cc; - + g_assert (visual != NULL); g_assert (colormap != NULL); - + cc = g_new (GdkColorContext, 1); ccp = (GdkColorContextPrivate *) cc; ccp->xdisplay = gdk_display; @@ -639,9 +639,9 @@ gdk_color_context_new_mono (GdkVisual *visual, cc->cmap = NULL; cc->mode = GDK_CC_MODE_UNDEFINED; cc->need_to_free_colormap = FALSE; - + init_bw (cc); - + return (GdkColorContext *) cc; } @@ -651,7 +651,7 @@ 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)) { @@ -663,17 +663,17 @@ gdk_color_context_free (GdkColorContext *cc) 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); - + if (cc->color_hash) { g_hash_table_foreach (cc->color_hash, @@ -681,7 +681,7 @@ gdk_color_context_free (GdkColorContext *cc) NULL); g_hash_table_destroy (cc->color_hash); } - + g_free (cc); } @@ -695,146 +695,146 @@ gdk_color_context_get_pixel (GdkColorContext *cc, 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; - } - + { + 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; - } - + { + 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; - } - + { + 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; - - color.red = red; - color.green = green; - color.blue = blue; - - 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_print ("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; - 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; - } + { + GdkColor color; + GdkColor *result; + + color.red = red; + color.green = green; + color.blue = blue; + + 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; + 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; + } } } @@ -861,37 +861,37 @@ gdk_color_context_get_pixels (GdkColorContext *cc, 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]; @@ -901,114 +901,114 @@ gdk_color_context_get_pixels (GdkColorContext *cc, failed[nopen++] = i; } } - + *nallocated = ncols; - + /* all colors available, all done */ - + if ((ncols == ncolors) || (nopen == 0)) { GDK_NOTE (COLOR_CONTEXT, - g_print ("gdk_color_context_get_pixels: got all %i colors; " - "(%i colors allocated so far)\n", ncolors, cc->num_allocated)); - + 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]; @@ -1024,68 +1024,68 @@ gdk_color_context_get_pixels (GdkColorContext *cc, /* 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_print ("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)); - + 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 @@ -1099,15 +1099,15 @@ gdk_color_context_get_pixels (GdkColorContext *cc, subst_col++; #endif } - + colors[i] = defs[i].pixel; } while (++idx < nopen); - + GDK_NOTE (COLOR_CONTEXT, - g_print ("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)); + 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 @@ -1128,7 +1128,7 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, #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); @@ -1136,19 +1136,19 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, 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 @@ -1157,7 +1157,7 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, * When colors[i] == 0 it indicates the slot is available for * allocation. */ - + if (used[i] != FALSE) { if (colors[i] == 0) @@ -1165,11 +1165,11 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, 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]; @@ -1181,100 +1181,100 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, #ifdef DEBUG else GDK_NOTE (COLOR_CONTEXT, - g_print ("gdk_color_context_get_pixels_incremental: " - "pixel at slot %i already allocated, skipping\n", i)); + 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_print ("gdk_color_context_get_pixels_incremental: got all %i colors " - "(%i colors allocated so far)\n", - ncolors, cc->num_allocated)); - + 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]; @@ -1292,64 +1292,64 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, /* deal with in next stage if allocation failed */ } while (++idx < counter); - + *nallocated = ncols; - + if ((ncols == ncolors) || (nopen == 0)) { GDK_NOTE (COLOR_CONTEXT, - g_print ("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)); - + 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 @@ -1363,16 +1363,16 @@ gdk_color_context_get_pixels_incremental (GdkColorContext *cc, subst_col++; #endif } - + colors[i] = defs[i].pixel; } while (++idx < nopen); - + GDK_NOTE (COLOR_CONTEXT, - g_print ("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)); + 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 @@ -1389,10 +1389,10 @@ gdk_color_context_query_colors (GdkColorContext *cc, { gint i; GdkColor *tc; - + g_assert (cc != NULL); g_assert (colors != NULL); - + switch (cc->mode) { case GDK_CC_MODE_BW: @@ -1404,7 +1404,7 @@ gdk_color_context_query_colors (GdkColorContext *cc, 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++) @@ -1419,7 +1419,7 @@ gdk_color_context_query_colors (GdkColorContext *cc, return 1; } break; - + case GDK_CC_MODE_STD_CMAP: default: if (cc->cmap == NULL) @@ -1431,17 +1431,17 @@ gdk_color_context_query_colors (GdkColorContext *cc, { 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; @@ -1473,94 +1473,94 @@ gdk_color_context_add_palette (GdkColorContext *cc, 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) { /* GDK_CC_MODE_STD_CMAP uses a hash table, so we'd better initialize one */ - + /* XXX: here, the hash table is already initialized */ - + return 0; } - + /* Initialize a hash table for this palette (we need one for allocating * the pixels in the palette using the current settings) */ - + if (cc->color_hash == NULL) cc->color_hash = g_hash_table_new (hash_color, compare_colors); - + /* 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_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; } @@ -1569,17 +1569,17 @@ 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++) @@ -1587,7 +1587,7 @@ gdk_color_context_init_dither (GdkColorContext *cc) 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; @@ -1600,10 +1600,10 @@ 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; } @@ -1619,23 +1619,23 @@ gdk_color_context_get_pixel_from_palette (GdkColorContext *cc, 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; @@ -1644,14 +1644,14 @@ gdk_color_context_get_pixel_from_palette (GdkColorContext *cc, err = dr; erg = dg; erb = db; - + if (mindif == 0) break; } } - + /* we failed to map onto a color */ - + if (j == -1) *failed = TRUE; else @@ -1660,7 +1660,7 @@ gdk_color_context_get_pixel_from_palette (GdkColorContext *cc, *green = ABS (erg); *blue = ABS (erb); } - + return pixel; } @@ -1675,23 +1675,23 @@ gdk_color_context_get_index_from_palette (GdkColorContext *cc, 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; @@ -1699,14 +1699,14 @@ gdk_color_context_get_index_from_palette (GdkColorContext *cc, err = dr; erg = dg; erb = db; - + if (mindif == 0) break; } } - + /* we failed to map onto a color */ - + if (j == -1) { *failed = TRUE; @@ -1715,11 +1715,11 @@ gdk_color_context_get_index_from_palette (GdkColorContext *cc, else { /* return error fractions */ - + *red = err; *green = erg; *blue = erb; } - + return j; } |