diff --git a/src/color.c b/src/color.c index f972594..2660803 100644 --- a/src/color.c +++ b/src/color.c @@ -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; diff --git a/src/color.h b/src/color.h index 834b459..c9123c7 100644 --- a/src/color.h +++ b/src/color.h @@ -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 diff --git a/src/context.c b/src/context.c index 2c63582..5bc5c7b 100644 --- a/src/context.c +++ b/src/context.c @@ -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); diff --git a/src/rend.c b/src/rend.c index 685ada7..7105750 100644 --- a/src/rend.c +++ b/src/rend.c @@ -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)), diff --git a/src/rgba.c b/src/rgba.c index 3821401..120637a 100644 --- a/src/rgba.c +++ b/src/rgba.c @@ -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; }