being an anally retentive bastard.. i checked if e worked in 8bpp under vnc.

GASP! it didn't. evas's color allocator was screwed. fixed! :)


SVN revision: 24686
This commit is contained in:
Carsten Haitzler 2006-08-14 13:50:07 +00:00
parent 7735577d0c
commit 8b1f602f38
4 changed files with 40 additions and 15 deletions

View File

@ -151,8 +151,8 @@ typedef enum _Convert_Pal_Mode
PAL_MODE_RGB221,
PAL_MODE_RGB222,
PAL_MODE_RGB232,
PAL_MODE_RGB666,
PAL_MODE_RGB332,
PAL_MODE_RGB666,
PAL_MODE_LAST
} Convert_Pal_Mode;

View File

@ -1,10 +1,6 @@
#ifndef EVAS_ENGINE_H
#define EVAS_ENGINE_H
/* PERF:
* # EVAS BENCH: 4.072
*/
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>

View File

@ -82,7 +82,8 @@ evas_software_x11_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
if (evas_software_x11_x_output_buffer_bit_order(xob) == MSBFirst)
buf->priv.x.bit_swap = 1;
#endif
if ((vis->class == TrueColor) || (vis->class == DirectColor))
if (((vis->class == TrueColor) || (vis->class == DirectColor)) &&
(x_depth > 8))
{
buf->priv.mask.r = (DATA32) vis->red_mask;
buf->priv.mask.g = (DATA32) vis->green_mask;
@ -96,7 +97,9 @@ evas_software_x11_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
}
else if ((vis->class == PseudoColor) ||
(vis->class == StaticColor) ||
(vis->class == GrayScale) || (vis->class == StaticGray))
(vis->class == GrayScale) ||
(vis->class == StaticGray) ||
(x_depth <= 8))
{
Convert_Pal_Mode pm = PAL_MODE_RGB332;

View File

@ -40,13 +40,14 @@ x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v)
{
int r, g, b, i;
DATA8 *color_lut;
int sig_mask = 0;
int sig_mask = 0, delt = 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((nr) * (ng) * (nb));
if (!color_lut) return NULL;
delt = 0x0101 * 3;
for (r = 0; r < (nr); r++)
{
for (g = 0; g < (ng); g++)
@ -57,26 +58,48 @@ x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v)
XColor xcl_in;
int val;
Status ret;
int dr, dg, db;
val = (int)((((double)r) / ((nr) - 1)) * 65535);
val = (int)((((double)r) / ((nr) - 1)) * 255);
val = (val << 8) | val;
xcl.red = (unsigned short)(val);
val = (int)((((double)g) / ((ng) - 1)) * 65535);
val = (int)((((double)g) / ((ng) - 1)) * 255);
val = (val << 8) | val;
xcl.green = (unsigned short)(val);
val = (int)((((double)b) / ((nb) - 1)) * 65535);
val = (int)((((double)b) / ((nb) - 1)) * 255);
val = (val << 8) | val;
xcl.blue = (unsigned short)(val);
xcl_in = xcl;
ret = XAllocColor(d, cmap, &xcl);
dr = (int)xcl_in.red - (int)xcl.red;
if (dr < 0) dr = -dr;
dg = (int)xcl_in.green - (int)xcl.green;
if (dg < 0) dg = -dg;
db = (int)xcl_in.blue - (int)xcl.blue;
if (db < 0) db = -db;
/*
printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
ret,
xcl_in.red, xcl_in.green, xcl_in.blue,
xcl.red, xcl.green, xcl.blue,
(dr + dg +db), delt);
*/
if ((ret == 0) ||
((dr + dg + db) > delt)
/*
||
((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)))
((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))
*/
)
{
unsigned long pixels[256];
int j;
if (i > 0)
{
for(j = 0; j < i; j++)
for (j = 0; j < i; j++)
pixels[j] = (unsigned long) color_lut[j];
XFreeColors(d, cmap, pixels, i, 0);
}
@ -110,7 +133,8 @@ x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v)
int val;
Status ret;
val = (int)((((double)g) / ((ng) - 1)) * 65535);
val = (int)((((double)g) / ((ng) - 1)) * 255);
val = (val << 8) | val;
xcl.red = (unsigned short)(val);
xcl.green = (unsigned short)(val);
xcl.blue = (unsigned short)(val);
@ -126,7 +150,7 @@ x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v)
if (i > 0)
{
for(j = 0; j < i; j++)
for (j = 0; j < i; j++)
pixels[j] = (unsigned long) color_lut[j];
XFreeColors(d, cmap, pixels, i, 0);
}
@ -269,6 +293,7 @@ evas_software_x11_x_color_allocate(Display *disp, Colormap cmap, Visual *vis, Co
Convert_Pal_Mode c;
Evas_List *l;
/* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
for (l = palettes; l; l = l->next)
{
pal = l->data;
@ -287,6 +312,7 @@ evas_software_x11_x_color_allocate(Display *disp, Colormap cmap, Visual *vis, Co
{
if (x_color_alloc[c])
{
/* printf("TRY PAL %i\n", c);*/
pal->lookup = (x_color_alloc[c])(disp, cmap, vis);
if (pal->lookup) break;
}