Refix Sun bug #6685465: Xephyr uses wrong or bad colortable in 8-bit mode

<http://bugs.opensolaris.org/view_bug.do?bug_id=6685465>

This is a refix of the previous fix for CR 6685465.  In the first fix
I was shifting the colors to match the mask by the bits_per_rgb amount
in the visual structure.  That field has nothing to do with the # of
bits to shift by.  I should just instead shift the bits to match the mask.
This commit is contained in:
Jeremy Uejio 2008-11-25 16:26:44 -08:00 committed by Alan Coopersmith
parent d5f9a131a2
commit 416685c295

View File

@ -578,14 +578,14 @@ hostx_get_visual_masks (EphyrScreenInfo screen,
} }
static int static int
hostx_calculate_color_shift(unsigned long mask, hostx_calculate_color_shift(unsigned long mask)
int bits_per_rgb)
{ {
int shift = 0; int shift = 1;
while(mask) { /* count # of bits in mask */
mask = mask >> bits_per_rgb; while (mask=(mask>>1)) shift++;
if (mask) shift += bits_per_rgb; /* cmap entry is an unsigned char so adjust it by size of that */
} shift = shift - sizeof(unsigned char) * 8;
if (shift < 0) shift = 0;
return shift; return shift;
} }
@ -601,12 +601,9 @@ hostx_set_cmap_entry(unsigned char idx,
static int first_time = 1; static int first_time = 1;
if (first_time) { if (first_time) {
first_time = 0; first_time = 0;
rshift = hostx_calculate_color_shift(HostX.visual->red_mask, rshift = hostx_calculate_color_shift(HostX.visual->red_mask);
HostX.visual->bits_per_rgb); gshift = hostx_calculate_color_shift(HostX.visual->green_mask);
gshift = hostx_calculate_color_shift(HostX.visual->green_mask, bshift = hostx_calculate_color_shift(HostX.visual->blue_mask);
HostX.visual->bits_per_rgb);
bshift = hostx_calculate_color_shift(HostX.visual->blue_mask,
HostX.visual->bits_per_rgb);
} }
HostX.cmap[idx] = ((r << rshift) & HostX.visual->red_mask) | HostX.cmap[idx] = ((r << rshift) & HostX.visual->red_mask) |
((g << gshift) & HostX.visual->green_mask) | ((g << gshift) & HostX.visual->green_mask) |