Enlightenment CVS committal Author : doursse Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/xrender_xcb Modified Files: Makefile.am evas_engine.c evas_engine_image.c evas_engine_xrender.c Log Message: fix a leak in xcb eng sfw (it remains one, but I don't see where it comes from). Update the xrender one. Don't use them yet (but who uses them ??), because it relies on fix of xcb that are in my hd =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 11 Mar 2006 01:55:17 -0000 1.2 +++ Makefile.am 23 Apr 2006 15:38:23 -0000 1.3 @@ -2,7 +2,7 @@ MAINTAINERCLEANFILES = Makefile.in -INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/modules/engines @FREETYPE_CFLAGS@ @xcb_cflags@ +INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/modules/engines @FREETYPE_CFLAGS@ @xcbrender_cflags@ if BUILD_ENGINE_XRENDER_XCB @@ -18,7 +18,7 @@ evas_engine_font.c \ evas_engine_gradient.c -module_la_LIBADD = @xcb_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LIBADD = @xcbrender_libs@ $(top_builddir)/src/lib/libevas.la module_la_LDFLAGS = -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs module_la_DEPENDENCIES = $(top_builddir)/config.h =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine.c 16 Mar 2006 08:16:16 -0000 1.2 +++ evas_engine.c 23 Apr 2006 15:38:23 -0000 1.3 @@ -113,6 +113,7 @@ { Render_Engine *re; Evas_Engine_Info_XRender_Xcb *info; + int resize = 1; info = (Evas_Engine_Info_XRender_Xcb *)in; if (!e->engine.data.output) @@ -134,6 +135,7 @@ if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); e->engine.data.output = re; + resize = 0; } re = e->engine.data.output; if (!re) return; @@ -150,19 +152,31 @@ re->xcbinf = _xr_image_info_get(re->conn, re->win, re->vis); if (re->output) _xr_render_surface_free(re->output); - re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, 0); - if (re->mask.xid) - { - XCBDRAWABLE draw; - - if (re->mask_output) _xr_render_surface_free(re->mask_output); - draw.pixmap = re->mask; - re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw, - e->output.w, e->output.h, - re->xcbinf->fmt1, 1); - } + if (re->mask_output) _xr_render_surface_free(re->mask_output); + if (!re->mask.xid) + re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, re->destination_alpha); + else + re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, 0); + if (re->mask.xid) { + XCBDRAWABLE draw; + + draw.pixmap = re->mask; + re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw, + e->output.w, e->output.h, + re->xcbinf->fmt1, 1); + } else re->mask_output = NULL; + if (resize) + { + if (re->tb) evas_common_tilebuf_free(re->tb); + if ((e->output.w > 0) && (e->output.h > 0)) + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + else + re->tb = evas_common_tilebuf_new(1, 1); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } } static void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_image.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine_image.c 15 Mar 2006 21:14:34 -0000 1.2 +++ evas_engine_image.c 23 Apr 2006 15:38:23 -0000 1.3 @@ -279,7 +279,8 @@ ww = w; hh = h; RECTS_CLIP_TO_RECT(x, y, ww, hh, 0, 0, im->w, im->h); old_surface = im->surface; - im->surface = _xr_render_surface_new(old_surface->xcbinf, w, h, old_surface->fmt, old_surface->alpha); + im->surface = _xr_render_surface_new(old_surface->xcbinf, + w + 1, h + 1, old_surface->fmt, old_surface->alpha); if (im->surface) _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, ww, hh); _xr_render_surface_free(old_surface); @@ -451,11 +452,14 @@ old_surface = im->surface; im->surface = NULL; if (im->alpha) - im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt32, 1); + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt32, 1); else - im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt24, 0); + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt24, 0); if (im->surface) - _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w, im->h); + _xr_render_surface_copy(old_surface, + im->surface, 0, 0, 0, 0, im->w + 1, im->h + 1); _xr_render_surface_free(old_surface); } if (im->updates) @@ -517,14 +521,29 @@ } if (im->alpha) { - im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt32, 1); + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt32, 1); _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h); } else { - im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt24, 0); + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt24, 0); _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h); - } + } + /* fill right and bottom pixel so interpolation works right */ + _xr_render_surface_copy(im->surface, im->surface, + im->w - 1, 0, + im->w, 0, + 1, im->h); + _xr_render_surface_copy(im->surface, im->surface, + 0, im->h - 1, + 0, im->h, + im->w, 1); + _xr_render_surface_copy(im->surface, im->surface, + im->w - 1, im->h - 1, + im->w, im->h, + 1, 1); if ((im->im) && (!im->dirty)) { evas_common_image_unref(im->im); =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_xrender.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_engine_xrender.c 10 Mar 2006 19:10:07 -0000 1.1 +++ evas_engine_xrender.c 23 Apr 2006 15:38:23 -0000 1.2 @@ -93,9 +93,9 @@ CARD32 mask; CARD32 values[3]; - rs = calloc(1, sizeof(XCBrender_Surface)); - fmt = XCBRenderFindVisualFormat(xcbinf->conn, xcbinf->vis); + if (!fmt) return NULL; + rs = calloc(1, sizeof(XCBrender_Surface)); rs->xcbinf = xcbinf; rs->w = w; rs->h = h; @@ -386,6 +386,7 @@ void _xr_render_surface_composite(XCBrender_Surface *srs, XCBrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth) { + XCBrender_Surface *trs = NULL; XCBRenderTRANSFORM xf; XCBRenderPICTURE mask; CARD32 value_mask; @@ -395,6 +396,65 @@ int op; if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; + value_mask = XCBRenderCPClipMask; + value_list[0] = 0; + XCBRenderChangePicture(srs->xcbinf->conn, srs->pic, value_mask, value_list); + XCBRenderChangePicture(srs->xcbinf->conn, drs->pic, value_mask, value_list); + + op = XCBRenderPictOpSrc; + if (srs->alpha) op = XCBRenderPictOpOver; + mask.xid = 0; + if ((dc) && (dc->mul.use)) + { + r = (int)(R_VAL(&dc->mul.col)); + g = (int)(G_VAL(&dc->mul.col)); + b = (int)(B_VAL(&dc->mul.col)); + a = (int)(A_VAL(&dc->mul.col)); + if ((r != 0xff) || (g != 0xff) || (b != 0xff) || (a != 0xff)) + { + if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) || + (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a)) + { + srs->xcbinf->mul_r = r; + srs->xcbinf->mul_g = g; + srs->xcbinf->mul_b = b; + srs->xcbinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul, + r, + g, + b, + a, + 0, 0, 1, 1); + } + op = XCBRenderPictOpOver; + value_mask = XCBRenderCPComponentAlpha; + value_list[0] = 1; + XCBRenderChangePicture(srs->xcbinf->conn, mask, value_mask, value_list); + if ((r == 0xff) && (g == 0xff) && (b == 0xff) && (a != 0xff)) + { + } + else + { + xf.matrix11 = 1; + xf.matrix12 = 0; + xf.matrix13 = 0; + + xf.matrix21 = 0; + xf.matrix22 = 1; + xf.matrix23 = 0; + + xf.matrix31 = 0; + xf.matrix32 = 0; + xf.matrix33 = 1; + trs = _xr_render_surface_new(srs->xcbinf, sw, sh, srs->fmt, srs->alpha); + XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf); + XCBRenderComposite(srs->xcbinf->conn, XCBRenderPictOpSrc, srs->pic, mask, trs->pic, + sx, sy, 0, 0, 0, 0, sw, sh); + mask.xid = 0; + } + } + } + sf = MAX(sw, sh); #define BMAX 26 @@ -424,45 +484,32 @@ xf.matrix32 = 0; xf.matrix33 = sf; - op = XCBRenderPictOpSrc; - if (srs->alpha) op = XCBRenderPictOpOver; - mask.xid = 0; - if ((dc) && (dc->mul.use)) + _xr_render_surface_clips_set(drs, dc, x, y, w, h); + if (trs) { - r = (int)(R_VAL(&dc->mul.col)); - g = (int)(G_VAL(&dc->mul.col)); - b = (int)(B_VAL(&dc->mul.col)); - a = (int)(A_VAL(&dc->mul.col)); - if ((r != 0xff) || (g != 0xff) || (b != 0xff) || (a != 0xff)) - { - if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) || - (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a)) - { - srs->xcbinf->mul_r = r; - srs->xcbinf->mul_g = g; - srs->xcbinf->mul_b = b; - srs->xcbinf->mul_a = a; - _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); - } - op = XCBRenderPictOpOver; - mask = srs->xcbinf->mul->pic; - } + if (smooth) + XCBRenderSetPictureFilter (trs->xcbinf->conn, trs->pic, strlen ("best"), "best", 0, NULL); + else + XCBRenderSetPictureFilter (trs->xcbinf->conn, trs->pic, strlen ("nearest"), "nearest", 0, NULL); + XCBRenderSetPictureTransform(trs->xcbinf->conn, trs->pic, xf); + + XCBRenderComposite(srs->xcbinf->conn, op, trs->pic, mask, drs->pic, + 0, 0, 0, 0, x, y, w, h); + _xr_render_surface_free(trs); } - - XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf); - value_mask = XCBRenderCPClipMask; - value_list[0] = 0; - XCBRenderChangePicture(srs->xcbinf->conn, srs->pic, value_mask, value_list); - XCBRenderChangePicture(srs->xcbinf->conn, drs->pic, value_mask, value_list); - - if (smooth) XCBRenderSetPictureFilter(srs->xcbinf->conn, srs->pic, strlen("best"), "best", 0, NULL); - else XCBRenderSetPictureFilter(srs->xcbinf->conn, srs->pic, strlen("nearest"), "nearest", 0, NULL); - - _xr_render_surface_clips_set(drs, dc, x, y, w, h); - XCBRenderComposite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic, - ((sx * w) + (sw / 2)) / sw, - ((sy * h) + (sh / 2)) / sh, - 0, 0, x, y, w, h); + else + { + if (smooth) + XCBRenderSetPictureFilter (srs->xcbinf->conn, srs->pic, strlen ("best"), "best", 0, NULL); + else + XCBRenderSetPictureFilter (srs->xcbinf->conn, srs->pic, strlen ("nearest"), "nearest", 0, NULL); + XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf); + + XCBRenderComposite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic, + ((sx * w) + (sw / 2)) / sw, + ((sy * h) + (sh / 2)) / sh, + 0, 0, x, y, w, h); + } } void @@ -473,7 +520,7 @@ CARD32 value_mask; CARD32 value_list[1]; - if ((w <= 0) || (h <= 0)) return; + if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return; xf.matrix11 = 1; xf.matrix12 = 0; xf.matrix13 = 0; ------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs