Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: Makefile.am evas_soft16.h evas_soft16_font.c evas_soft16_main.c Added Files: evas_soft16_rectangle.c evas_soft16_scanline_blend.c evas_soft16_scanline_fill.c Log Message: Clean up structure, split into files. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 19 Jun 2007 22:52:12 -0000 1.2 +++ Makefile.am 20 Jun 2007 19:10:15 -0000 1.3 @@ -13,7 +13,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ -evas_soft16_font.c +evas_soft16_font.c \ +evas_soft16_rectangle.c module_la_LIBADD = $(top_builddir)/src/lib/libevas.la module_la_LDFLAGS = -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs @@ -25,4 +26,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ -evas_soft16_font.c +evas_soft16_font.c \ +evas_soft16_rectangle.c \ +evas_soft16_scanline_fill.c \ +evas_soft16_scanline_blend.c + =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_soft16.h 19 Jun 2007 22:52:12 -0000 1.3 +++ evas_soft16.h 20 Jun 2007 19:10:15 -0000 1.4 @@ -2,8 +2,8 @@ #define EVAS_SOFT16_H #include "Evas.h" -#include "evas_private.h" #include "evas_common.h" +#include "evas_private.h" #define RGB_565_UNPACKED_MASK 0x07e0f81f #define RGB_565_UNPACK(rgb) \ @@ -35,7 +35,7 @@ #endif /* __ARMEL__ */ typedef struct _Soft16_Image Soft16_Image; - + struct _Soft16_Image { const char *file; // file source - optional @@ -50,31 +50,31 @@ RGBA_Image *source_im; // original source rgba image - if still reffed Evas_Image_Load_Opts lo; // load options - + unsigned char have_alpha : 1; // 1 if we have halpha unsigned char free_pixels : 1; // 1 if pixels should be freed unsigned char free_alpha : 1; // 1 if alpha mask should be freed }; -Soft16_Image *soft16_image_new(int w, int h, int stride, int have_alpha, - DATA16 *pixels, int copy); +/** + * Image (evas_soft16_main.c) + */ +Soft16_Image *soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, int copy); void soft16_image_free(Soft16_Image *im); -Soft16_Image *soft16_image_load(const char *file, const char *key, int *error, - Evas_Image_Load_Opts *lo); +Soft16_Image *soft16_image_load(const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo); void soft16_image_load_data(Soft16_Image *im); -void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_region_x, int src_region_y, - int src_region_w, int src_region_h, - int dst_region_x, int dst_region_y, - int dst_region_w, int dst_region_h, - int smooth); +void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, int smooth); +/** + * Rectangle (evas_soft16_rectangle.c) + */ void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); - +/** + * Font (evas_soft16_font.c) + */ void *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg); void soft16_font_glyph_free(void *ext_dat); void soft16_font_glyph_draw(Soft16_Image *dst, void *data, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_font.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_font.c 19 Jun 2007 22:52:12 -0000 1.1 +++ evas_soft16_font.c 20 Jun 2007 19:10:15 -0000 1.2 @@ -1,5 +1,3 @@ -#include "evas_common.h" -#include "evas_private.h" #include "evas_soft16.h" static inline void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- evas_soft16_main.c 19 Jun 2007 22:52:12 -0000 1.5 +++ evas_soft16_main.c 20 Jun 2007 19:10:15 -0000 1.6 @@ -1,26 +1,9 @@ -#include "evas_common.h" -#include "evas_private.h" #include "evas_soft16.h" +#include "evas_soft16_scanline_blend.c" #define IMG_BYTE_SIZE(stride, height, has_alpha) \ ((stride) * (height) * (!(has_alpha) ? 2 : 3)) - -static inline void _soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size); -static inline void _soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size); - -static inline void _soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha); -static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha); - -static inline void _soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); -static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); - -static inline void _soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b); -static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b); - -static inline void _soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565); -static inline void _soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha); - static Evas_Hash *_soft16_image_cache_hash = NULL; static inline int @@ -911,597 +894,3 @@ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; } -static inline void -_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, - int offset, int w, int h) -{ - DATA16 *dst_itr, rgb565; - int i; - - dst_itr = dst->pixels + offset; - rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), - G_VAL(&dc->col.col), - B_VAL(&dc->col.col)); - - for (i = 0; i < h; i++, dst_itr += dst->stride) - _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); -} - -static inline void -_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, - int offset, int w, int h) -{ - char alpha; - - alpha = A_VAL(&dc->col.col) >> 3; - if (alpha == 31) _soft16_rectangle_draw_solid_solid(dst, dc, offset, w, h); - else if (alpha != 0) - { - DATA16 *dst_itr; - DATA32 rgb565; - int i; - - dst_itr = dst->pixels + offset; - rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), - G_VAL(&dc->col.col), - B_VAL(&dc->col.col)); - rgb565 = RGB_565_UNPACK(rgb565); - - for (i = 0; i < h; i++, dst_itr += dst->stride) - _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565, alpha); - } -} - -static void -_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc, - Evas_Rectangle dr) -{ - int dst_offset; - - if (_is_empty_rectangle(&dr)) return; - RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h); - if (_is_empty_rectangle(&dr)) return; - - if (dc->clip.use) - RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x, - dc->clip.y, dc->clip.w, dc->clip.h); - if (_is_empty_rectangle(&dr)) return; - if (A_VAL(&dc->col.col) == 0) return; - - dst_offset = dr.x + (dr.y * dst->w); - - if (!dst->have_alpha) - { - if (A_VAL(&dc->col.col) == 255) - _soft16_rectangle_draw_solid_solid - (dst, dc, dst_offset, dr.w, dr.h); - else - _soft16_rectangle_draw_transp_solid - (dst, dc, dst_offset, dr.w, dr.h); - } - else - fprintf(stderr, - "Unsupported feature: drawing rectangle to non-opaque " - "destination.\n"); -} - -void -soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, - int x, int y, int w, int h) -{ - Evas_Rectangle dr; - Cutout_Rects *rects; - Cutout_Rect *r; - int c, cx, cy, cw, ch; - int i; - - /* handle cutouts here! */ - dr.x = x; - dr.y = y; - dr.w = w; - dr.h = h; - - if (_is_empty_rectangle(&dr)) return; - if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) - return; - - /* no cutouts - cut right to the chase */ - if (!dc->cutout.rects) - { - _soft16_rectangle_draw_int(dst, dc, dr); - return; - } - - /* save out clip info */ - c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; - evas_common_draw_context_clip_clip(dc, 0, 0, dst->w, dst->h); - evas_common_draw_context_clip_clip(dc, x, y, w, h); - /* our clip is 0 size.. abort */ - if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) - { - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; - return; - } - rects = evas_common_draw_context_apply_cutouts(dc); - for (i = 0; i < rects->active; ++i) - { - r = rects->rects + i; - evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); - _soft16_rectangle_draw_int(dst, dc, dr); - } - evas_common_draw_context_apply_clear_cutouts(rects); - /* restore clip info */ - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; -} - - -/***************************************************************************** - * Scanline processing - * - * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]() - * - ****************************************************************************/ - -/*********************************************************************** - * fill operations - */ -static inline void -_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565) -{ - DATA16 *start, *end; - DATA32 rgb565_double; - - start = dst; - end = start + (size & ~7); - - rgb565_double = (rgb565 << 16) | rgb565; - - while (start < end) - { - DATA32 *p = (DATA32 *)start; - - p[0] = rgb565_double; - p[1] = rgb565_double; - p[2] = rgb565_double; - p[3] = rgb565_double; - - start += 8; - } - - end = start + (size & 7); - for (; start < end; start++) - *start = rgb565; -} - -static inline void -_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha) -{ - DATA16 *start, *end; - DATA32 a; - - start = dst; - pld(start, 0); - end = start + (size & ~7); - -#define BLEND(dst) \ - { DATA32 b; \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); \ - dst = RGB_565_PACK(b); } - - while (start < end) - { - pld(start, 32); - UNROLL8({ - BLEND(*start); - start++; - }); - } - - end = start + (size & 7); - for (; start < end; start++) - BLEND(*start); -#undef BLEND -} - -/*********************************************************************** - * Regular blend operations - */ -static inline void -_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - (dst) = (src); \ - else if (alpha != 0) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha); \ - dst = RGB_565_PACK(b); \ - } - - /* work on 8 pixels per time, do data preload */ - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - /* empirical tests show these give the best performance */ - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - /* remaining pixels (up to 7) */ - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size) -{ - memcpy(dst, src, size * sizeof(DATA16)); -} - -/*********************************************************************** - * Blend operations taking an extra alpha (fade in, out) - */ -static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (alpha > rel_alpha) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} - -/*********************************************************************** - * Blend operations with extra alpha and multiply color - */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - - /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ -#define BLEND(dst, src, alpha) \ - if ((alpha) > rel_alpha) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(src, 32); - pld(start, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} - -/*********************************************************************** - * Blend operations with extra multiply color - */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } \ - else if (alpha != 0) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs