+ int i;
+ XColor xcolor2;
+
+ xcolor2.flags = DoRed | DoGreen | DoBlue;
+
+ xcolor.red= *(image->rgb.red + a);
+ xcolor.green= *(image->rgb.green + a);
+ xcolor.blue= *(image->rgb.blue + a);
+
+ /* look if this color already exists in our colormap */
+
+ #if 0
+ for (i=max_cmap_entries-1; i>=free_cmap_entries; i--)
+
+ #else
+ for (i=max_cmap_entries-1; i>=0; i--)
+ {
+ /*
+ if (!pixel_used[i])
+ continue;
+ */
+ #endif
+
+ xcolor2.pixel = *(our_default_index + i);
+
+ #if 0
+ XQueryColor(disp, ximageinfo->cmap, &xcolor2);
+ #else
+ xcolor2 = xcolor_used[xcolor2.pixel];
+ #endif
+
+ if ((xcolor.red >> 8) == (xcolor2.red >> 8) &&
+ (xcolor.green >> 8) == (xcolor2.green >> 8) &&
+ (xcolor.blue >> 8) == (xcolor2.blue >> 8))
+ break;
+ }
+
+ use_cmap_entry = i;
+
+ if (0 && use_cmap_entry < free_cmap_entries) /* not found in colormap */
+ {
+ free_cmap_entries--;
+ }
+ else if (0 && use_cmap_entry < free_cmap_entries) /* not found in colormap */
+ {
+ }
+ else if (use_cmap_entry < 0) /* not found in colormap */
+ {
+ /* look for an existing 'unused' color near the one we want */
+
+ for (i=free_cmap_entries-1; i>=0; i--)
+ {
+ int closeness = 14;
+
+ if (pixel_used[i])
+ continue;
+
+ xcolor2.pixel = *(our_default_index + i);
+
+ #if 0
+ XQueryColor(disp, ximageinfo->cmap, &xcolor2);
+ #else
+ xcolor2 = xcolor_used[xcolor2.pixel];
+ #endif
+
+
+ if ((xcolor.red >> closeness) == (xcolor2.red >> closeness) &&
+ (xcolor.green >> closeness) == (xcolor2.green >> closeness) &&
+ (xcolor.blue >> closeness) == (xcolor2.blue >> closeness))
+ break;
+ }
+
+ use_cmap_entry = i;
+
+ if (use_cmap_entry < 0) /* no 'near' color found */
+ {
+ /* look for the next free color */
+
+ while (pixel_used[--free_cmap_entries])
+ ;
+ use_cmap_entry = free_cmap_entries;
+ }
+ }
+
+ if (free_cmap_entries < 0)
+ {
+ printf("imageToXImage: too many global colors!\n");
+ exit(0);
+ }
+
+
+ /*
+ printf("--> eating color %d\n", use_cmap_entry);
+ */
+
+
+
+ xcolor.pixel = use_cmap_entry;
+
+ xcolor_used[xcolor.pixel] = xcolor;
+
+ *(ximageinfo->index + a) = xcolor.pixel;
+
+ XStoreColor(disp, ximageinfo->cmap, &xcolor);
+
+ pixel_used[use_cmap_entry] = 1;