handle lower depths :)

SVN revision: 3482
This commit is contained in:
Carsten Haitzler 2000-09-15 23:47:27 +00:00
parent 9fce1f5580
commit 69c726a9cf
5 changed files with 191 additions and 83 deletions

View File

@ -46,7 +46,7 @@ __imlib_BestVisual(Display *d, int screen, int *depth_return)
{
for (i = 0; i < num; i++)
{
if ((xvir[i].depth == 8) &&
if ((xvir[i].depth > 1) &&
(xvir[i].depth >= maxd) &&
(xvi.class == PseudoColor))
{
@ -63,62 +63,70 @@ __imlib_BestVisual(Display *d, int screen, int *depth_return)
XFree(xvir);
}
}
printf("%x\n", v->visualid);
if (depth_return)
*depth_return = maxd;
return v;
}
DATA8 *
__imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return)
__imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return, Visual *v)
{
DATA8 *color_lut = NULL;
if ((_max_colors >= 256) && (color_lut = __imlib_AllocColors332(d, cmap)))
if (v->bits_per_rgb > 1)
{
if ((_max_colors >= 256) && (color_lut = __imlib_AllocColors332(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 216) && (color_lut = __imlib_AllocColors666(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 128) && (color_lut = __imlib_AllocColors232(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 64) && (color_lut = __imlib_AllocColors222(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 32) && (color_lut = __imlib_AllocColors221(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 16) && (color_lut = __imlib_AllocColors121(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
}
if ((_max_colors >= 8) && (color_lut = __imlib_AllocColors111(d, cmap, v)))
{
*type_return = _pal_type;
return color_lut;
}
if ((_max_colors >= 216) && (color_lut = __imlib_AllocColors666(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);
color_lut = __imlib_AllocColors1(d, cmap, v);
*type_return = _pal_type;
return color_lut;
}
DATA8 *
__imlib_AllocColors332(Display *d, Colormap cmap)
__imlib_AllocColors332(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(256 * sizeof(DATA8));
for (r = 0; r < 8; r++)
{
@ -127,7 +135,9 @@ __imlib_AllocColors332(Display *d, Colormap cmap)
for (b = 0; b < 4; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 6) | (r << 3) | (r);
xcl.red = (unsigned short)((val << 7) | (val >> 2));
@ -135,7 +145,12 @@ __imlib_AllocColors332(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -159,11 +174,15 @@ __imlib_AllocColors332(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors666(Display *d, Colormap cmap)
__imlib_AllocColors666(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(256 * sizeof(DATA8));
for (r = 0; r < 6; r++)
{
@ -172,7 +191,9 @@ __imlib_AllocColors666(Display *d, Colormap cmap)
for (b = 0; b < 6; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (int)((((double)r) / 5.0) * 65535);
xcl.red = (unsigned short)(val);
@ -180,7 +201,12 @@ __imlib_AllocColors666(Display *d, Colormap cmap)
xcl.green = (unsigned short)(val);
val = (int)((((double)b) / 5.0) * 65535);
xcl.blue = (unsigned short)(val);
if (!XAllocColor(d, cmap, &xcl))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -204,11 +230,15 @@ __imlib_AllocColors666(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors232(Display *d, Colormap cmap)
__imlib_AllocColors232(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(128 * sizeof(DATA8));
for (r = 0; r < 4; r++)
{
@ -217,7 +247,9 @@ __imlib_AllocColors232(Display *d, Colormap cmap)
for (b = 0; b < 4; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 6) | (r << 4) | (r << 2) | (r);
xcl.red = (unsigned short)((val << 8) | (val));
@ -225,7 +257,12 @@ __imlib_AllocColors232(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -249,11 +286,15 @@ __imlib_AllocColors232(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors222(Display *d, Colormap cmap)
__imlib_AllocColors222(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(64 * sizeof(DATA8));
for (r = 0; r < 4; r++)
{
@ -262,7 +303,9 @@ __imlib_AllocColors222(Display *d, Colormap cmap)
for (b = 0; b < 4; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 6) | (r << 4) | (r << 2) | (r);
xcl.red = (unsigned short)((val << 8) | (val));
@ -270,7 +313,12 @@ __imlib_AllocColors222(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -294,11 +342,15 @@ __imlib_AllocColors222(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors221(Display *d, Colormap cmap)
__imlib_AllocColors221(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(32 * sizeof(DATA8));
for (r = 0; r < 4; r++)
{
@ -307,7 +359,9 @@ __imlib_AllocColors221(Display *d, Colormap cmap)
for (b = 0; b < 2; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 6) | (r << 4) | (r << 2) | (r);
xcl.red = (unsigned short)((val << 8) | (val));
@ -315,7 +369,12 @@ __imlib_AllocColors221(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -339,11 +398,15 @@ __imlib_AllocColors221(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors121(Display *d, Colormap cmap)
__imlib_AllocColors121(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(16 * sizeof(DATA8));
for (r = 0; r < 2; r++)
{
@ -352,7 +415,9 @@ __imlib_AllocColors121(Display *d, Colormap cmap)
for (b = 0; b < 2; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 7) | (r << 6) | (r << 5) | (r << 4) | (r << 3) | (r << 2) | (r << 1) | (r);
xcl.red = (unsigned short)((val << 8) | (val));
@ -360,7 +425,12 @@ __imlib_AllocColors121(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -384,11 +454,15 @@ __imlib_AllocColors121(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors111(Display *d, Colormap cmap)
__imlib_AllocColors111(Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i = 0;
int r, g, b, i ;
DATA8 *color_lut;
int sig_mask = 0;
for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
sig_mask <<= (16 - v->bits_per_rgb);
i = 0;
color_lut = malloc(8 * sizeof(DATA8));
for (r = 0; r < 2; r++)
{
@ -397,7 +471,9 @@ __imlib_AllocColors111(Display *d, Colormap cmap)
for (b = 0; b < 2; b++)
{
XColor xcl;
XColor xcl_in;
int val;
Status ret;
val = (r << 7) | (r << 6) | (r << 5) | (r << 4) | (r << 3) | (r << 2) | (r << 1) | (r);
xcl.red = (unsigned short)((val << 8) | (val));
@ -405,7 +481,12 @@ __imlib_AllocColors111(Display *d, Colormap cmap)
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))
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
if ((ret == Success) ||
((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
{
unsigned long pixels[256];
int j;
@ -429,7 +510,7 @@ __imlib_AllocColors111(Display *d, Colormap cmap)
}
DATA8 *
__imlib_AllocColors1(Display *d, Colormap cmap)
__imlib_AllocColors1(Display *d, Colormap cmap, Visual *v)
{
XColor xcl;
DATA8 *color_lut;

View File

@ -4,13 +4,13 @@ extern DATA16 _max_colors;
int __imlib_XActualDepth(Display *d, Visual *v);
Visual *__imlib_BestVisual(Display *d, int screen, int *depth_return);
DATA8 * __imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return);
DATA8 * __imlib_AllocColors332(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors666(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors232(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors222(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors221(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors121(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors111(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColors1(Display *d, Colormap cmap);
DATA8 * __imlib_AllocColorTable(Display *d, Colormap cmap, DATA8 *type_return, Visual *v);
DATA8 * __imlib_AllocColors332(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors666(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors232(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors222(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors221(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors121(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors111(Display *d, Colormap cmap, Visual *v);
DATA8 * __imlib_AllocColors1(Display *d, Colormap cmap, Visual *v);
#endif

View File

@ -156,7 +156,7 @@ __imlib_NewContext(Display *d, Visual *v, Colormap c, int depth)
if (depth <= 8)
{
ct->palette = __imlib_AllocColorTable(d, c, &(ct->palette_type));
ct->palette = __imlib_AllocColorTable(d, c, &(ct->palette_type), v);
ct->r_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);
ct->g_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);
ct->b_dither = malloc(sizeof(DATA8) * 8 * 8 * 256);

View File

@ -19,12 +19,42 @@
void
__imlib_generic_render(DATA32 *src, int jump, int w, int h, int dx, int dy,
XImage *xim, Visual *v)
XImage *xim, Visual *v, Context *ct)
{
unsigned int x, y, r, g, b, val, hh;
unsigned int rmask, gmask, bmask;
int i, rshift, gshift, bshift;
const DATA8 _dither_88[8][8] =
{
{ 0, 32, 8, 40, 2, 34, 10, 42 },
{ 48, 16, 56, 24, 50, 18, 58, 26 },
{ 12, 44, 4, 36, 14, 46, 6, 38 },
{ 60, 28, 52, 20, 62, 30, 54, 22 },
{ 3, 35, 11, 43, 1, 33, 9, 41 },
{ 51, 19, 59, 27, 49, 17, 57, 25 },
{ 15, 47, 7, 39, 13, 45, 5, 37 },
{ 63, 31, 55, 23, 61, 29, 53, 21 }
};
if (xim->depth == 1)
{
hh = dy + h;
for (y = dy; y < hh; y++)
{
for (x = dx; x < w; x++)
{
r = R_VAL(src);
g = G_VAL(src);
b = B_VAL(src);
val = (R_VAL(src) + G_VAL(src) + B_VAL(src)) / 12;
if (val > _dither_88[x & 0x3][y & 0x3]) val = ct->palette[1];
else val = ct->palette[0];
XPutPixel(xim, x, y, val);
src++;
}
}
return;
}
rmask = xim->red_mask;
gmask = xim->green_mask;
bmask = xim->blue_mask;
@ -290,7 +320,7 @@ __imlib_RenderImage(Display *d, ImlibImage *im,
((DATA8 *)xim->data) + (y * (xim->bytes_per_line)),
xim->bytes_per_line, dw, hh, dx, dy + y);
else
__imlib_generic_render(pointer, jump, dw, hh, 0, y, xim, v);
__imlib_generic_render(pointer, jump, dw, hh, 0, y, xim, v, ct);
if (m)
masker(pointer, jump,
((DATA8 *)mxim->data) + (y * (mxim->bytes_per_line)),

View File

@ -1166,12 +1166,12 @@ static DATA8 _dither_a1[8 * 8 * 256];
#define RGB111_RSHIFT >> 21
#define RGB111_BMASK & 0x01
#define RGB111_GMASK & 0x02
#define RGB111_RMASK & 0x30
#define RGB111_RMASK & 0x04
#define WRITE1_RGBA_RGB111(src, dest) \
*dest = _dither_color_lut[((*src RGB111_BSHIFT) RGB111_BMASK) | \
((*src RGB111_GSHIFT) RGB111_GMASK) | \
((*src RGB111_RSHIFT) RGB111_RMASK)]; dest++; src++
((*src RGB111_RSHIFT) RGB111_RMASK)]; dest++; src++
#ifdef WORDS_BIGENDIAN
#define WRITE2_RGBA_RGB111(src, dest) \
{ \
@ -1450,7 +1450,7 @@ __imlib_RGBA_init(void *rd, void *gd, void *bd, int depth, DATA8 palette_type)
{ 63, 31, 55, 23, 61, 29, 53, 21 }
};
int i, x, y;
if (!dither_a_init)
{
for (y = 0; y < 8; y++)
@ -1529,7 +1529,7 @@ __imlib_RGBA_init(void *rd, void *gd, void *bd, int depth, DATA8 palette_type)
}
}
break;
case 8:
default:
rd8 = (DATA8 *)rd;
gd8 = (DATA8 *)gd;
bd8 = (DATA8 *)bd;
@ -1775,8 +1775,6 @@ __imlib_RGBA_init(void *rd, void *gd, void *bd, int depth, DATA8 palette_type)
break;
}
break;
default:
break;
}
}
@ -3892,7 +3890,6 @@ __imlib_GetRGBAFunction(int depth,
return __imlib_RGBA_to_RGB666_fast;
}
}
printf("Imlib2: unknown depth %i\n", depth);
return NULL;
}