Modified and totally untested code to load the color tables for DirectColor and PseudoColor windows.
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403472
This commit is contained in:
parent
3f633e7313
commit
d088f9a9ca
2 changed files with 69 additions and 82 deletions
|
@ -30,8 +30,8 @@ typedef struct
|
|||
Display *display;
|
||||
int scrNum;
|
||||
Colormap colormap;
|
||||
XStandardColormap cmap;
|
||||
Visual visual;
|
||||
Uint16 *ramp;
|
||||
} cmapTableEntry;
|
||||
|
||||
cmapTableEntry *cmapTable = NULL;
|
||||
|
@ -49,8 +49,8 @@ X11_LookupColormap(Display * display, int scrNum, VisualID vid)
|
|||
for (i = 0; i < numCmaps; i++) {
|
||||
if (cmapTable[i].display == display &&
|
||||
cmapTable[i].scrNum == scrNum &&
|
||||
cmapTable[i].cmap.visualid == vid) {
|
||||
return cmapTable[i].cmap.colormap;
|
||||
cmapTable[i].visual.visualid == vid) {
|
||||
return cmapTable[i].colormap;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,9 +60,11 @@ X11_LookupColormap(Display * display, int scrNum, VisualID vid)
|
|||
|
||||
void
|
||||
X11_TrackColormap(Display * display, int scrNum, Colormap colormap,
|
||||
XStandardColormap * cmap, Visual * visual)
|
||||
Visual * visual, XColor * ramp)
|
||||
{
|
||||
int i;
|
||||
Uint16 *newramp;
|
||||
int ncolors;
|
||||
|
||||
/* search the table to find out if we already have this one. We
|
||||
only want one entry for each display, screen number, visualid,
|
||||
|
@ -70,8 +72,8 @@ X11_TrackColormap(Display * display, int scrNum, Colormap colormap,
|
|||
for (i = 0; i < numCmaps; i++) {
|
||||
if (cmapTable[i].display == display &&
|
||||
cmapTable[i].scrNum == scrNum &&
|
||||
cmapTable[i].cmap.visualid == cmap->visualid &&
|
||||
cmapTable[i].cmap.colormap == colormap) {
|
||||
cmapTable[i].visual.visualid == visual->visualid &&
|
||||
cmapTable[i].colormap == colormap) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -88,8 +90,24 @@ X11_TrackColormap(Display * display, int scrNum, Colormap colormap,
|
|||
cmapTable[numCmaps].display = display;
|
||||
cmapTable[numCmaps].scrNum = scrNum;
|
||||
cmapTable[numCmaps].colormap = colormap;
|
||||
SDL_memcpy(&cmapTable[numCmaps].cmap, cmap, sizeof(XStandardColormap));
|
||||
SDL_memcpy(&cmapTable[numCmaps].visual, visual, sizeof(Visual));
|
||||
cmapTable[numCmaps].ramp = NULL;
|
||||
|
||||
newramp = SDL_malloc(3 * 256 * sizeof(Uint16)); /* The size of *all* SDL gamma ramps */
|
||||
if (NULL == newramp) {
|
||||
SDL_SetError("Out of memory in X11_TrackColormap()");
|
||||
return;
|
||||
}
|
||||
SDL_memset(newramp, 0, sizeof(*newramp));
|
||||
cmapTable[numCmaps].ramp = newramp;
|
||||
|
||||
ncolors = cmapTable[numCmaps].visual.map_entries;
|
||||
|
||||
for (i = 0; i < ncolors; i++) {
|
||||
newramp[(0 * 256) + i] = ramp[i].red;
|
||||
newramp[(1 * 256) + i] = ramp[i].green;
|
||||
newramp[(2 * 256) + i] = ramp[i].blue;
|
||||
}
|
||||
|
||||
numCmaps++;
|
||||
}
|
||||
|
@ -103,44 +121,69 @@ X11_TrackColormap(Display * display, int scrNum, Colormap colormap,
|
|||
int
|
||||
X11_SetDisplayGammaRamp(_THIS, Uint16 * ramp)
|
||||
{
|
||||
Visual *visual;
|
||||
Display *display;
|
||||
Colormap colormap;
|
||||
XColor *colorcells;
|
||||
int ncolors;
|
||||
int rmask, gmask, bmask;
|
||||
int rshift, gshift, bshift;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
int rmax, gmax, bmax;
|
||||
int rmul, gmul, bmul;
|
||||
|
||||
for (j = 0; j < numCmaps; j++) {
|
||||
if (cmapTable[j].visual.class == DirectColor) {
|
||||
display = cmapTable[j].display;
|
||||
colormap = cmapTable[j].colormap;
|
||||
ncolors = cmapTable[j].visual.map_entries;
|
||||
visual = &cmapTable[j].visual;
|
||||
|
||||
colorcells = SDL_malloc(ncolors * sizeof(XColor));
|
||||
if (NULL == colorcells) {
|
||||
SDL_SetError("out of memory in X11_SetDisplayGammaRamp");
|
||||
return -1;
|
||||
}
|
||||
/* remember the new ramp */
|
||||
SDL_memcpy(cmapTable[j].ramp, ramp, sizeof(*cmapTable[j].ramp));
|
||||
|
||||
rmax = cmapTable[j].cmap.red_max + 1;
|
||||
gmax = cmapTable[j].cmap.blue_max + 1;
|
||||
bmax = cmapTable[j].cmap.green_max + 1;
|
||||
rshift = 0;
|
||||
rmask = visual->red_mask;
|
||||
while (0 == (rmask & 1)) {
|
||||
rshift++;
|
||||
rmask >>= 1;
|
||||
}
|
||||
|
||||
rmul = cmapTable[j].cmap.red_mult;
|
||||
gmul = cmapTable[j].cmap.blue_mult;
|
||||
bmul = cmapTable[j].cmap.green_mult;
|
||||
/* printf("rmask = %4x rshift = %4d\n", rmask, rshift); */
|
||||
|
||||
gshift = 0;
|
||||
gmask = visual->green_mask;
|
||||
while (0 == (gmask & 1)) {
|
||||
gshift++;
|
||||
gmask >>= 1;
|
||||
}
|
||||
|
||||
/* printf("gmask = %4x gshift = %4d\n", gmask, gshift); */
|
||||
|
||||
bshift = 0;
|
||||
bmask = visual->blue_mask;
|
||||
while (0 == (bmask & 1)) {
|
||||
bshift++;
|
||||
bmask >>= 1;
|
||||
}
|
||||
|
||||
/* printf("bmask = %4x bshift = %4d\n", bmask, bshift); */
|
||||
|
||||
/* build the color table pixel values */
|
||||
for (i = 0; i < ncolors; i++) {
|
||||
Uint32 red = (rmax * i) / ncolors;
|
||||
Uint32 green = (gmax * i) / ncolors;
|
||||
Uint32 blue = (bmax * i) / ncolors;
|
||||
Uint32 rbits = (rmask * i) / (ncolors - 1);
|
||||
Uint32 gbits = (gmask * i) / (ncolors - 1);
|
||||
Uint32 bbits = (bmask * i) / (ncolors - 1);
|
||||
|
||||
Uint32 pix =
|
||||
(rbits << rshift) | (gbits << gshift) | (bbits << bshift);
|
||||
|
||||
colorcells[i].pixel = pix;
|
||||
|
||||
colorcells[i].pixel =
|
||||
(red * rmul) | (green * gmul) | (blue * bmul);
|
||||
colorcells[i].flags = DoRed | DoGreen | DoBlue;
|
||||
|
||||
colorcells[i].red = ramp[(0 * 256) + i];
|
||||
|
@ -160,73 +203,17 @@ X11_SetDisplayGammaRamp(_THIS, Uint16 * ramp)
|
|||
int
|
||||
X11_GetDisplayGammaRamp(_THIS, Uint16 * ramp)
|
||||
{
|
||||
Display *display;
|
||||
Colormap colormap;
|
||||
XColor *colorcells;
|
||||
int ncolors;
|
||||
int dc;
|
||||
int i;
|
||||
|
||||
int rmax, gmax, bmax;
|
||||
int rmul, gmul, bmul;
|
||||
|
||||
/* find the first DirectColor colormap and use it to get the gamma
|
||||
ramp */
|
||||
|
||||
dc = -1;
|
||||
for (i = 0; i < numCmaps; i++) {
|
||||
if (cmapTable[i].visual.class == DirectColor) {
|
||||
dc = i;
|
||||
break;
|
||||
SDL_memcpy(ramp, cmapTable[i].ramp, sizeof(*cmapTable[i].ramp));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (dc < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* there is at least one DirectColor colormap in the cmapTable,
|
||||
let's just get the entries from that colormap */
|
||||
|
||||
display = cmapTable[dc].display;
|
||||
colormap = cmapTable[dc].colormap;
|
||||
ncolors = cmapTable[dc].visual.map_entries;
|
||||
colorcells = SDL_malloc(ncolors * sizeof(XColor));
|
||||
if (NULL == colorcells) {
|
||||
SDL_SetError("out of memory in X11_GetDisplayGammaRamp");
|
||||
return -1;
|
||||
}
|
||||
|
||||
rmax = cmapTable[dc].cmap.red_max + 1;
|
||||
gmax = cmapTable[dc].cmap.blue_max + 1;
|
||||
bmax = cmapTable[dc].cmap.green_max + 1;
|
||||
|
||||
rmul = cmapTable[dc].cmap.red_mult;
|
||||
gmul = cmapTable[dc].cmap.blue_mult;
|
||||
bmul = cmapTable[dc].cmap.green_mult;
|
||||
|
||||
/* build the color table pixel values */
|
||||
for (i = 0; i < ncolors; i++) {
|
||||
Uint32 red = (rmax * i) / ncolors;
|
||||
Uint32 green = (gmax * i) / ncolors;
|
||||
Uint32 blue = (bmax * i) / ncolors;
|
||||
|
||||
colorcells[i].pixel = (red * rmul) | (green * gmul) | (blue * bmul);
|
||||
}
|
||||
|
||||
XQueryColors(display, colormap, colorcells, ncolors);
|
||||
|
||||
/* prepare the values to be returned. Note that SDL assumes that
|
||||
gamma ramps are always 3 * 256 entries long with the red entries
|
||||
in the first 256 elements, the green in the second 256 elements
|
||||
and the blue in the last 256 elements */
|
||||
|
||||
for (i = 0; i < ncolors; i++) {
|
||||
ramp[(0 * 256) + i] = colorcells[i].red;
|
||||
ramp[(1 * 256) + i] = colorcells[i].green;
|
||||
ramp[(2 * 256) + i] = colorcells[i].blue;
|
||||
}
|
||||
|
||||
SDL_free(colorcells);
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
extern Colormap X11_LookupColormap(Display * display, int scrNum,
|
||||
VisualID vid);
|
||||
extern void X11_TrackColormap(Display * display, int scrNum,
|
||||
Colormap colormap, XStandardColormap * cmap,
|
||||
Visual * visual);
|
||||
Colormap colormap,
|
||||
Visual * visual, XColor * ramp);
|
||||
|
||||
extern int X11_SetDisplayGammaRamp(_THIS, Uint16 * ramp);
|
||||
extern int X11_GetDisplayGammaRamp(_THIS, Uint16 * ramp);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue