395 lines
8.9 KiB
C
395 lines
8.9 KiB
C
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include "common.h"
|
|
#include "color.h"
|
|
|
|
DATA8 _pal_type = 0;
|
|
DATA16 _max_colors = 256;
|
|
|
|
int
|
|
__imlib_XActualDepth(Display *d, Visual *v)
|
|
{
|
|
XVisualInfo xvi, *xvir;
|
|
int depth = 0, num;
|
|
|
|
xvi.visual = v;
|
|
xvi.visualid = XVisualIDFromVisual(v);
|
|
xvir = XGetVisualInfo(d, VisualIDMask, &xvi, &num);
|
|
if (xvir)
|
|
{
|
|
depth = xvir[0].depth;
|
|
if ((depth == 16) && (xvir->red_mask != 0xf800))
|
|
depth = 15;
|
|
XFree(xvir);
|
|
}
|
|
return depth;
|
|
}
|
|
|
|
Visual *
|
|
__imlib_BestVisual(Display *d, int screen, int *depth_return)
|
|
{
|
|
XVisualInfo xvi, *xvir;
|
|
int i, num, maxd = 0;
|
|
Visual *v = NULL;
|
|
|
|
xvi.screen = screen;
|
|
for (xvi.class = TrueColor; xvi.class >= StaticGray; xvi.class--)
|
|
{
|
|
xvir = XGetVisualInfo(d, VisualScreenMask | VisualClassMask,
|
|
&xvi, &num);
|
|
if (xvir)
|
|
{
|
|
maxd = 0;
|
|
for (i = 0; i < num; i++)
|
|
{
|
|
if (xvir[i].depth > maxd)
|
|
{
|
|
maxd = xvir[i].depth;
|
|
v = xvir[i].visual;
|
|
}
|
|
}
|
|
XFree(xvir);
|
|
}
|
|
if (v)
|
|
{
|
|
if (depth_return)
|
|
*depth_return = maxd;
|
|
return v;
|
|
}
|
|
}
|
|
if (depth_return)
|
|
*depth_return = maxd;
|
|
return v;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return)
|
|
{
|
|
DATA8 *color_lut = NULL;
|
|
|
|
if ((_max_colors >= 256) && (color_lut = __imlib_AllocColors332(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
if ((_max_colors >= 128) && (color_lut = __imlib_AllocColors232(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
if ((_max_colors >= 64) && (color_lut = __imlib_AllocColors222(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
if ((_max_colors >= 32) && (color_lut = __imlib_AllocColors221(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
if ((_max_colors >= 16) && (color_lut = __imlib_AllocColors121(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
if ((_max_colors >= 8) && (color_lut = __imlib_AllocColors111(d, cmap)))
|
|
{
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
color_lut = __imlib_AllocColors1(d, cmap);
|
|
*type_return = _pal_type;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors332(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(256 * sizeof(DATA8));
|
|
for (r = 0; r < 8; r++)
|
|
{
|
|
for (g = 0; g < 8; g++)
|
|
{
|
|
for (b = 0; b < 4; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 6) | (r << 3) | (r);
|
|
xcl.red = (unsigned short)((val << 7) | (val >> 2));
|
|
val = (g << 6) | (g << 3) | (g);
|
|
xcl.green = (unsigned short)((val << 7) | (val >> 2));
|
|
val = (b << 6) | (b << 4) | (b << 2) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 0;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors232(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(128 * sizeof(DATA8));
|
|
for (r = 0; r < 4; r++)
|
|
{
|
|
for (g = 0; g < 8; g++)
|
|
{
|
|
for (b = 0; b < 4; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 6) | (r << 4) | (r << 2) | (r);
|
|
xcl.red = (unsigned short)((val << 8) | (val));
|
|
val = (g << 6) | (g << 3) | (g);
|
|
xcl.green = (unsigned short)((val << 7) | (val >> 2));
|
|
val = (b << 6) | (b << 4) | (b << 2) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 1;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors222(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(64 * sizeof(DATA8));
|
|
for (r = 0; r < 4; r++)
|
|
{
|
|
for (g = 0; g < 4; g++)
|
|
{
|
|
for (b = 0; b < 4; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 6) | (r << 4) | (r << 2) | (r);
|
|
xcl.red = (unsigned short)((val << 8) | (val));
|
|
val = (g << 6) | (g << 4) | (g << 2) | (g);
|
|
xcl.green = (unsigned short)((val << 8) | (val));
|
|
val = (b << 6) | (b << 4) | (b << 2) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 2;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors221(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(32 * sizeof(DATA8));
|
|
for (r = 0; r < 4; r++)
|
|
{
|
|
for (g = 0; g < 4; g++)
|
|
{
|
|
for (b = 0; b < 2; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 6) | (r << 4) | (r << 2) | (r);
|
|
xcl.red = (unsigned short)((val << 8) | (val));
|
|
val = (g << 6) | (g << 4) | (g << 2) | (g);
|
|
xcl.green = (unsigned short)((val << 8) | (val));
|
|
val = (b << 7) | (b << 6) | (b << 5) | (b << 4) | (b << 3) | (b << 2) | (b << 1) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 3;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors121(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(16 * sizeof(DATA8));
|
|
for (r = 0; r < 2; r++)
|
|
{
|
|
for (g = 0; g < 4; g++)
|
|
{
|
|
for (b = 0; b < 2; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 7) | (r << 6) | (r << 5) | (r << 4) | (r << 3) | (r << 2) | (r << 1) | (r);
|
|
xcl.red = (unsigned short)((val << 8) | (val));
|
|
val = (g << 6) | (g << 4) | (g << 2) | (g);
|
|
xcl.green = (unsigned short)((val << 8) | (val));
|
|
val = (b << 7) | (b << 6) | (b << 5) | (b << 4) | (b << 3) | (b << 2) | (b << 1) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 4;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors111(Display *d, Colormap cmap)
|
|
{
|
|
int r, g, b, i = 0;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(8 * sizeof(DATA8));
|
|
for (r = 0; r < 2; r++)
|
|
{
|
|
for (g = 0; g < 2; g++)
|
|
{
|
|
for (b = 0; b < 2; b++)
|
|
{
|
|
XColor xcl;
|
|
int val;
|
|
|
|
val = (r << 7) | (r << 6) | (r << 5) | (r << 4) | (r << 3) | (r << 2) | (r << 1) | (r);
|
|
xcl.red = (unsigned short)((val << 8) | (val));
|
|
val = (g << 7) | (g << 6) | (g << 5) | (g << 4) | (g << 3) | (g << 2) | (g << 1) | (g);
|
|
xcl.green = (unsigned short)((val << 8) | (val));
|
|
val = (b << 7) | (b << 6) | (b << 5) | (b << 4) | (b << 3) | (b << 2) | (b << 1) | (b);
|
|
xcl.blue = (unsigned short)((val << 8) | (val));
|
|
if (!XAllocColor(d, cmap, &xcl))
|
|
{
|
|
unsigned long pixels[256];
|
|
int j;
|
|
|
|
if (i > 0)
|
|
{
|
|
for(j = 0; j < i; j++)
|
|
pixels[j] = (unsigned long) color_lut[j];
|
|
XFreeColors(d, cmap, pixels, i, 0);
|
|
}
|
|
free(color_lut);
|
|
return NULL;
|
|
}
|
|
color_lut[i] = xcl.pixel;
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
_pal_type = 5;
|
|
return color_lut;
|
|
}
|
|
|
|
DATA8 *
|
|
__imlib_AllocColors1(Display *d, Colormap cmap)
|
|
{
|
|
XColor xcl;
|
|
DATA8 *color_lut;
|
|
|
|
color_lut = malloc(2 * sizeof(DATA8));
|
|
xcl.red = (unsigned short)(0x0000);
|
|
xcl.green = (unsigned short)(0x0000);
|
|
xcl.blue = (unsigned short)(0x0000);
|
|
XAllocColor(d, cmap, &xcl);
|
|
color_lut[0] = xcl.pixel;
|
|
xcl.red = (unsigned short)(0xffff);
|
|
xcl.green = (unsigned short)(0xffff);
|
|
xcl.blue = (unsigned short)(0xffff);
|
|
XAllocColor(d, cmap, &xcl);
|
|
color_lut[1] = xcl.pixel;
|
|
_pal_type = 6;
|
|
return color_lut;
|
|
}
|