ephyr: Implement per-screen colormaps
Xephyr's pseudocolor emulation added in:
commit 81a3b6fe27
Author: Matthew Allum <breakfast@10.am>
Date: Mon Nov 8 22:39:47 2004 +0000
Add support to Xephyr for lower depths than hosts
only tracks one global colormap for the whole (Xephyr) display. Move
this to per-screen state so each screen's colormap can be correct.
[ajax: rebased to 1.17, cleaned up commit message]
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Michele Baldessari <michele@redhat.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
7b076fdfc0
commit
924996c41c
|
@ -1292,7 +1292,7 @@ ephyrPutColors(ScreenPtr pScreen, int n, xColorItem * pdefs)
|
||||||
if (p > max)
|
if (p > max)
|
||||||
max = p;
|
max = p;
|
||||||
|
|
||||||
hostx_set_cmap_entry(p,
|
hostx_set_cmap_entry(pScreen, p,
|
||||||
pdefs->red >> 8,
|
pdefs->red >> 8,
|
||||||
pdefs->green >> 8, pdefs->blue >> 8);
|
pdefs->green >> 8, pdefs->blue >> 8);
|
||||||
pdefs++;
|
pdefs++;
|
||||||
|
|
|
@ -83,6 +83,7 @@ typedef struct _ephyrScrPriv {
|
||||||
|
|
||||||
KdScreenInfo *screen;
|
KdScreenInfo *screen;
|
||||||
int mynum; /* Screen number */
|
int mynum; /* Screen number */
|
||||||
|
unsigned long cmap[256];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Per-screen Xlib-using state for glamor (private to
|
* Per-screen Xlib-using state for glamor (private to
|
||||||
|
|
|
@ -82,8 +82,6 @@ struct EphyrHostXVars {
|
||||||
KdScreenInfo **screens;
|
KdScreenInfo **screens;
|
||||||
|
|
||||||
long damage_debug_msec;
|
long damage_debug_msec;
|
||||||
|
|
||||||
unsigned long cmap[256];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* memset ( missing> ) instead of below */
|
/* memset ( missing> ) instead of below */
|
||||||
|
@ -751,9 +749,12 @@ hostx_calculate_color_shift(unsigned long mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hostx_set_cmap_entry(unsigned char idx,
|
hostx_set_cmap_entry(ScreenPtr pScreen, unsigned char idx,
|
||||||
unsigned char r, unsigned char g, unsigned char b)
|
unsigned char r, unsigned char g, unsigned char b)
|
||||||
{
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
KdScreenInfo *screen = pScreenPriv->screen;
|
||||||
|
EphyrScrPriv *scrpriv = screen->driver;
|
||||||
/* need to calculate the shifts for RGB because server could be BGR. */
|
/* need to calculate the shifts for RGB because server could be BGR. */
|
||||||
/* XXX Not sure if this is correct for 8 on 16, but this works for 8 on 24.*/
|
/* XXX Not sure if this is correct for 8 on 16, but this works for 8 on 24.*/
|
||||||
static int rshift, bshift, gshift = 0;
|
static int rshift, bshift, gshift = 0;
|
||||||
|
@ -765,7 +766,7 @@ hostx_set_cmap_entry(unsigned char idx,
|
||||||
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);
|
bshift = hostx_calculate_color_shift(HostX.visual->blue_mask);
|
||||||
}
|
}
|
||||||
HostX.cmap[idx] = ((r << rshift) & HostX.visual->red_mask) |
|
scrpriv->cmap[idx] = ((r << rshift) & HostX.visual->red_mask) |
|
||||||
((g << gshift) & HostX.visual->green_mask) |
|
((g << gshift) & HostX.visual->green_mask) |
|
||||||
((b << bshift) & HostX.visual->blue_mask);
|
((b << bshift) & HostX.visual->blue_mask);
|
||||||
}
|
}
|
||||||
|
@ -1017,7 +1018,7 @@ hostx_paint_rect(KdScreenInfo *screen,
|
||||||
unsigned char pixel =
|
unsigned char pixel =
|
||||||
*(unsigned char *) (scrpriv->fb_data + idx);
|
*(unsigned char *) (scrpriv->fb_data + idx);
|
||||||
xcb_image_put_pixel(scrpriv->ximg, x, y,
|
xcb_image_put_pixel(scrpriv->ximg, x, y,
|
||||||
HostX.cmap[pixel]);
|
scrpriv->cmap[pixel]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -141,7 +141,7 @@ hostx_get_visual_masks(KdScreenInfo *screen,
|
||||||
CARD32 *rmsk, CARD32 *gmsk, CARD32 *bmsk);
|
CARD32 *rmsk, CARD32 *gmsk, CARD32 *bmsk);
|
||||||
void
|
void
|
||||||
|
|
||||||
hostx_set_cmap_entry(unsigned char idx,
|
hostx_set_cmap_entry(ScreenPtr pScreen, unsigned char idx,
|
||||||
unsigned char r, unsigned char g, unsigned char b);
|
unsigned char r, unsigned char g, unsigned char b);
|
||||||
|
|
||||||
void *hostx_screen_init(KdScreenInfo *screen,
|
void *hostx_screen_init(KdScreenInfo *screen,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user