Changed and hopefully fixed support for DirectColor with support for gammaramps.
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403471
This commit is contained in:
parent
742f9c70bf
commit
3f633e7313
1 changed files with 107 additions and 7 deletions
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "SDL_x11video.h"
|
#include "SDL_x11video.h"
|
||||||
#include "SDL_x11mouse.h"
|
#include "SDL_x11mouse.h"
|
||||||
|
#include "SDL_x11gamma.h"
|
||||||
#include "../Xext/extensions/StdCmap.h"
|
#include "../Xext/extensions/StdCmap.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -213,6 +214,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
|
||||||
xattr.border_pixel = 0;
|
xattr.border_pixel = 0;
|
||||||
|
|
||||||
if (visual->class == PseudoColor) {
|
if (visual->class == PseudoColor) {
|
||||||
|
/* printf("asking for PseudoColor\n"); */
|
||||||
int nmaps;
|
int nmaps;
|
||||||
XStandardColormap cmap;
|
XStandardColormap cmap;
|
||||||
XStandardColormap *stdmaps;
|
XStandardColormap *stdmaps;
|
||||||
|
@ -293,18 +295,116 @@ X11_CreateWindow(_THIS, SDL_Window * window)
|
||||||
displaydata->screen),
|
displaydata->screen),
|
||||||
visual, AllocAll);
|
visual, AllocAll);
|
||||||
XStoreColors(data->display, colormap, colorcells, ncolors);
|
XStoreColors(data->display, colormap, colorcells, ncolors);
|
||||||
SDL_free(colorcells);
|
|
||||||
|
|
||||||
xattr.colormap = colormap;
|
xattr.colormap = colormap;
|
||||||
X11_TrackColormap(data->display, displaydata->screen, colormap,
|
X11_TrackColormap(data->display, displaydata->screen, colormap,
|
||||||
&cmap, visual);
|
visual, colorcells);
|
||||||
|
SDL_free(colorcells);
|
||||||
}
|
}
|
||||||
} else if (visual->class == DirectColor) {
|
} else if (visual->class == DirectColor) {
|
||||||
/* FIXME: Allocate a read-write colormap for gamma fading someday */
|
Status status;
|
||||||
xattr.colormap =
|
XStandardColormap cmap;
|
||||||
XCreateColormap(data->display,
|
XColor *colorcells;
|
||||||
RootWindow(data->display, displaydata->screen),
|
Colormap colormap;
|
||||||
visual, AllocNone);
|
int i;
|
||||||
|
int ncolors;
|
||||||
|
int rmax, gmax, bmax;
|
||||||
|
int rmask, gmask, bmask;
|
||||||
|
int rshift, gshift, bshift;
|
||||||
|
|
||||||
|
/* Is the colormap we need already registered in SDL? */
|
||||||
|
if (colormap =
|
||||||
|
X11_LookupColormap(data->display,
|
||||||
|
displaydata->screen, visual->visualid)) {
|
||||||
|
xattr.colormap = colormap;
|
||||||
|
/* printf("found existing colormap\n"); */
|
||||||
|
} else {
|
||||||
|
/* The colormap is not known to SDL so we will create it */
|
||||||
|
colormap = XCreateColormap(data->display,
|
||||||
|
RootWindow(data->display,
|
||||||
|
displaydata->screen),
|
||||||
|
visual, AllocAll);
|
||||||
|
/* printf("colormap = %x\n", colormap); */
|
||||||
|
|
||||||
|
/* If we can't create a colormap, then we must die */
|
||||||
|
if (!colormap) {
|
||||||
|
SDL_SetError
|
||||||
|
("Couldn't create window: Could not create wriatable colormap");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* OK, we got a colormap, now fill it in as best as we can */
|
||||||
|
|
||||||
|
colorcells = SDL_malloc(visual->map_entries * sizeof(XColor));
|
||||||
|
if (NULL == colorcells) {
|
||||||
|
SDL_SetError("out of memory in X11_CreateWindow");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ncolors = visual->map_entries;
|
||||||
|
rmax = 0xffff;
|
||||||
|
gmax = 0xffff;
|
||||||
|
bmax = 0xffff;
|
||||||
|
|
||||||
|
rshift = 0;
|
||||||
|
rmask = visual->red_mask;
|
||||||
|
while (0 == (rmask & 1)) {
|
||||||
|
rshift++;
|
||||||
|
rmask >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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 - 1);
|
||||||
|
Uint32 green = (gmax * i) / (ncolors - 1);
|
||||||
|
Uint32 blue = (bmax * i) / (ncolors - 1);
|
||||||
|
|
||||||
|
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].red = red;
|
||||||
|
colorcells[i].green = green;
|
||||||
|
colorcells[i].blue = blue;
|
||||||
|
|
||||||
|
colorcells[i].flags = DoRed | DoGreen | DoBlue;
|
||||||
|
/* printf("%2d:%4x [%4x %4x %4x]\n", i, pix, red, green, blue); */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
status =
|
||||||
|
XStoreColors(data->display, colormap, colorcells, ncolors);
|
||||||
|
|
||||||
|
xattr.colormap = colormap;
|
||||||
|
X11_TrackColormap(data->display, displaydata->screen,
|
||||||
|
colormap, visual, colorcells);
|
||||||
|
|
||||||
|
SDL_free(colorcells);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
xattr.colormap =
|
xattr.colormap =
|
||||||
XCreateColormap(data->display,
|
XCreateColormap(data->display,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue