1 #include "evas_common.h"
2 #include "evas_engine.h"
7 typedef struct _Convert_Pal_Priv Convert_Pal_Priv;
9 struct _Convert_Pal_Priv
16 typedef DATA8 * (*X_Func_Alloc_Colors) (Display *d, Colormap cmap, Visual *v);
18 static X_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1];
19 static int x_color_count[PAL_MODE_LAST + 1];
20 static Evas_List *palettes = NULL;
22 static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v);
23 static DATA8 * x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v);
25 static DATA8 * x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v);
26 static DATA8 * x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v);
27 static DATA8 * x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v);
28 static DATA8 * x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v);
29 static DATA8 * x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v);
30 static DATA8 * x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v);
31 static DATA8 * x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v);
32 static DATA8 * x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v);
33 static DATA8 * x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v);
34 static DATA8 * x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v);
35 static DATA8 * x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v);
36 static DATA8 * x_color_alloc_mono(Display *d, Colormap cmap, Visual *v);
39 x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v)
43 int sig_mask = 0, delt = 0;
45 for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
46 sig_mask <<= (16 - v->bits_per_rgb);
48 color_lut = malloc((nr) * (ng) * (nb));
49 if (!color_lut) return NULL;
51 for (r = 0; r < (nr); r++)
53 for (g = 0; g < (ng); g++)
55 for (b = 0; b < (nb); b++)
63 val = (int)((((double)r) / ((nr) - 1)) * 255);
64 val = (val << 8) | val;
65 xcl.red = (unsigned short)(val);
66 val = (int)((((double)g) / ((ng) - 1)) * 255);
67 val = (val << 8) | val;
68 xcl.green = (unsigned short)(val);
69 val = (int)((((double)b) / ((nb) - 1)) * 255);
70 val = (val << 8) | val;
71 xcl.blue = (unsigned short)(val);
73 ret = XAllocColor(d, cmap, &xcl);
74 dr = (int)xcl_in.red - (int)xcl.red;
76 dg = (int)xcl_in.green - (int)xcl.green;
78 db = (int)xcl_in.blue - (int)xcl.blue;
81 printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
83 xcl_in.red, xcl_in.green, xcl_in.blue,
84 xcl.red, xcl.green, xcl.blue,
88 ((dr + dg + db) > delt)
91 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
92 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
93 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))
97 unsigned long pixels[256];
102 for (j = 0; j < i; j++)
103 pixels[j] = (unsigned long) color_lut[j];
104 XFreeColors(d, cmap, pixels, i, 0);
109 color_lut[i] = xcl.pixel;
118 x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v)
124 for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
125 sig_mask <<= (16 - v->bits_per_rgb);
127 color_lut = malloc(ng);
128 if (!color_lut) return NULL;
129 for (g = 0; g < (ng); g++)
136 val = (int)((((double)g) / ((ng) - 1)) * 255);
137 val = (val << 8) | val;
138 xcl.red = (unsigned short)(val);
139 xcl.green = (unsigned short)(val);
140 xcl.blue = (unsigned short)(val);
142 ret = XAllocColor(d, cmap, &xcl);
144 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
145 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
146 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
148 unsigned long pixels[256];
153 for (j = 0; j < i; j++)
154 pixels[j] = (unsigned long) color_lut[j];
155 XFreeColors(d, cmap, pixels, i, 0);
160 color_lut[i] = xcl.pixel;
167 x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v)
169 return x_color_alloc_rgb(8, 8, 4, d, cmap, v);
173 x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v)
175 return x_color_alloc_rgb(6, 6, 6, d, cmap, v);
179 x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v)
181 return x_color_alloc_rgb(4, 8, 4, d, cmap, v);
185 x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v)
187 return x_color_alloc_rgb(4, 4, 4, d, cmap, v);
191 x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v)
193 return x_color_alloc_rgb(4, 4, 2, d, cmap, v);
197 x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v)
199 return x_color_alloc_rgb(2, 4, 2, d, cmap, v);
203 x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v)
205 return x_color_alloc_rgb(2, 2, 2, d, cmap, v);
209 x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v)
211 return x_color_alloc_gray(256, d, cmap, v);
215 x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v)
217 return x_color_alloc_gray(64, d, cmap, v);
221 x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v)
223 return x_color_alloc_gray(32, d, cmap, v);
227 x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v)
229 return x_color_alloc_gray(16, d, cmap, v);
233 x_color_alloc_mono(Display *d, Colormap cmap, Visual *v)
235 return x_color_alloc_gray(2, d, cmap, v);
239 evas_software_x11_x_color_init(void)
241 static int initialised = 0;
243 if (initialised) return;
244 x_color_alloc[PAL_MODE_NONE] = NULL;
245 x_color_count[PAL_MODE_NONE] = 0;
247 x_color_alloc[PAL_MODE_MONO] = x_color_alloc_mono;
248 x_color_count[PAL_MODE_MONO] = 2;
250 x_color_alloc[PAL_MODE_GRAY4] = x_color_alloc_gray_4;
251 x_color_count[PAL_MODE_GRAY4] = 4;
253 x_color_alloc[PAL_MODE_GRAY16] = x_color_alloc_gray_16;
254 x_color_count[PAL_MODE_GRAY16] = 16;
256 x_color_alloc[PAL_MODE_GRAY64] = x_color_alloc_gray_64;
257 x_color_count[PAL_MODE_GRAY64] = 64;
259 x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256;
260 x_color_count[PAL_MODE_GRAY256] = 256;
262 x_color_alloc[PAL_MODE_RGB111] = x_color_alloc_rgb_111;
263 x_color_count[PAL_MODE_RGB111] = 2 * 2 * 2;
265 x_color_alloc[PAL_MODE_RGB121] = x_color_alloc_rgb_121;
266 x_color_count[PAL_MODE_RGB121] = 2 * 4 * 2;
268 x_color_alloc[PAL_MODE_RGB221] = x_color_alloc_rgb_221;
269 x_color_count[PAL_MODE_RGB221] = 4 * 4 * 2;
271 x_color_alloc[PAL_MODE_RGB222] = x_color_alloc_rgb_222;
272 x_color_count[PAL_MODE_RGB222] = 4 * 4 * 4;
274 x_color_alloc[PAL_MODE_RGB232] = x_color_alloc_rgb_232;
275 x_color_count[PAL_MODE_RGB232] = 4 * 8 * 4;
277 x_color_alloc[PAL_MODE_RGB666] = x_color_alloc_rgb_666;
278 x_color_count[PAL_MODE_RGB666] = 6 * 6 * 6;
280 x_color_alloc[PAL_MODE_RGB332] = x_color_alloc_rgb_332;
281 x_color_count[PAL_MODE_RGB332] = 8 * 8 * 4;
283 x_color_alloc[PAL_MODE_LAST] = NULL;
284 x_color_count[PAL_MODE_LAST] = 0;
289 evas_software_x11_x_color_allocate(Display *disp, Colormap cmap, Visual *vis, Convert_Pal_Mode colors)
291 Convert_Pal_Priv *palpriv;
296 /* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
297 for (l = palettes; l; l = l->next)
301 if ((disp == palpriv->disp) &&
302 (vis == palpriv->vis) &&
303 (cmap == palpriv->cmap))
309 pal = calloc(1, sizeof(struct _Convert_Pal));
310 if (!pal) return NULL;
311 for (c = colors; c > PAL_MODE_NONE; c--)
313 if (x_color_alloc[c])
315 /* printf("TRY PAL %i\n", c);*/
316 pal->lookup = (x_color_alloc[c])(disp, cmap, vis);
317 if (pal->lookup) break;
322 pal->count = x_color_count[c];
323 palpriv = calloc(1, sizeof(Convert_Pal_Priv));
327 if (pal->lookup) free(pal->lookup);
331 palpriv->disp = disp;
333 palpriv->cmap = cmap;
334 if (pal->colors == PAL_MODE_NONE)
336 if (pal->lookup) free(pal->lookup);
340 palettes = evas_list_append(palettes, pal);
345 evas_software_x11_x_color_deallocate(Display *disp, Colormap cmap, Visual *vis, Convert_Pal *pal)
347 unsigned long pixels[256];
351 if (pal->references > 0) return;
354 for(j = 0; j < pal->count; j++)
355 pixels[j] = (unsigned long) pal->lookup[j];
356 XFreeColors(disp, cmap, pixels, pal->count, 0);
360 palettes = evas_list_remove(palettes, pal);