Enlightenment CVS committal Author : raster Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/xrender_x11 Modified Files: evas_engine_xrender.c Log Message: fix color multiply whiel blend (ergh! need temporary image! yuk!) =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine_xrender.c 8 Mar 2006 13:43:46 -0000 1.2 +++ evas_engine_xrender.c 16 Apr 2006 17:04:36 -0000 1.3 @@ -302,6 +302,7 @@ void _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth) { + Xrender_Surface *trs = NULL; XTransform xf; XRenderPictureAttributes att; Picture mask; @@ -310,6 +311,64 @@ if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; + att.clip_mask = None; + XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att); + XRenderChangePicture(srs->xinf->disp, drs->pic, CPClipMask, &att); + + op = PictOpSrc; + if (srs->alpha) op = PictOpOver; + mask = None; + 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 == g == b == a == 0xff)) + { + if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) || + (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a)) + { + srs->xinf->mul_r = r; + srs->xinf->mul_g = g; + srs->xinf->mul_b = b; + srs->xinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(srs->xinf->mul, + r, + g, + b, + a, + 0, 0, 1, 1); + } + att.component_alpha = 1; + op = PictOpOver; + mask = srs->xinf->mul->pic; + XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att); + if ((r == g == b == 0xff) && (a != 0xff)) + { + } + else + { + xf.matrix[0][0] = 1; + xf.matrix[0][1] = 0; + xf.matrix[0][2] = 0; + + xf.matrix[1][0] = 0; + xf.matrix[1][1] = 1; + xf.matrix[1][2] = 0; + + xf.matrix[2][0] = 0; + xf.matrix[2][1] = 0; + xf.matrix[2][2] = 1; + trs = _xr_render_surface_new(srs->xinf, sw, sh, srs->fmt, srs->alpha); + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); + XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask, + trs->pic, sx, sy, 0, 0, 0, 0, sw, sh); + mask = 0; + } + } + } + sf = MAX(sw, sh); #define BMAX 26 if (sf <= 8 ) sf = 1 << (BMAX - 3); @@ -338,44 +397,32 @@ xf.matrix[2][1] = 0; xf.matrix[2][2] = sf; - op = PictOpSrc; - if (srs->alpha) op = PictOpOver; - mask = None; - 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 == g == b == a == 0xff)) - { - if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) || - (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a)) - { - srs->xinf->mul_r = r; - srs->xinf->mul_g = g; - srs->xinf->mul_b = b; - srs->xinf->mul_a = a; - _xr_render_surface_solid_rectangle_set(srs->xinf->mul, r, g, b, a, 0, 0, 1, 1); - } - op = PictOpOver; - mask = srs->xinf->mul->pic; - } + if (smooth) + XRenderSetPictureFilter(trs->xinf->disp, trs->pic, "best", NULL, 0); + else + XRenderSetPictureFilter(trs->xinf->disp, trs->pic, "nearest", NULL, 0); + XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf); + + XRenderComposite(srs->xinf->disp, op, trs->pic, mask, drs->pic, + 0, 0, 0, 0, x, y, w, h); + _xr_render_surface_free(trs); + } + else + { + if (smooth) + XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "best", NULL, 0); + else + XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "nearest", NULL, 0); + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); + + XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic, + ((sx * w) + (sw / 2)) / sw, + ((sy * h) + (sh / 2)) / sh, + 0, 0, x, y, w, h); } - - XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); - att.clip_mask = None; - XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att); - XRenderChangePicture(srs->xinf->disp, drs->pic, CPClipMask, &att); - - if (smooth) XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "best", NULL, 0); - else XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "nearest", NULL, 0); - - _xr_render_surface_clips_set(drs, dc, x, y, w, h); - XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic, - ((sx * w) + (sw / 2)) / sw, - ((sy * h) + (sh / 2)) / sh, - 0, 0, x, y, w, h); } void ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs