# HG changeset patch # User Sunny Sachanandani # Date 1279715071 -19800 # Node ID 9e9ec5e3be95eeb9ff54e15680df0e2c6b980e02 # Parent 4e145485971b30a5eab1a8505823556dc0a226d5 Get SDL_BLENDMODE_MOD to work! Tested on nvidia only ATM. diff -r 4e145485971b -r 9e9ec5e3be95 src/video/x11/SDL_x11render.c --- a/src/video/x11/SDL_x11render.c Tue Jul 20 11:43:13 2010 +0530 +++ b/src/video/x11/SDL_x11render.c Wed Jul 21 17:54:31 2010 +0530 @@ -380,20 +380,20 @@ (SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MASK | SDL_BLENDMODE_MOD); /* Create a clip mask that is used for rendering primitives. */ data->stencil = XCreatePixmap(data->display, data->xwindow, - window->w, window->h, 8); + window->w, window->h, 32); /* Create the GC for the clip mask. */ data->stencil_gc = XCreateGC(data->display, data->stencil, GCGraphicsExposures, &gcv); - XSetBackground(data->display, data->stencil_gc, 0x00); - XSetForeground(data->display, data->stencil_gc, 0x00); + XSetBackground(data->display, data->stencil_gc, 0); + XSetForeground(data->display, data->stencil_gc, 0); XFillRectangle(data->display, data->stencil, data->stencil_gc, 0, 0, window->w, window->h); - XSetForeground(data->display, data->stencil_gc, 0xFF); + XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF); data->stencil_pict = XRenderCreatePicture(data->display, data->stencil, XRenderFindStandardFormat(data->display, - PictStandardA8), + PictStandardARGB32), 0, NULL); #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE if (data->use_xdamage) { @@ -935,7 +935,7 @@ } case SDL_BLENDMODE_MOD: if (renderdata->use_xrender) { - data->blend_op = PictOpSrc; + data->blend_op = PictOpOver; return 0; } case SDL_BLENDMODE_MASK: @@ -1211,7 +1211,7 @@ renderer->blendMode != SDL_BLENDMODE_ADD && renderer->blendMode != SDL_BLENDMODE_MOD)) { - XSetForeground(data->display, data->stencil_gc, 0x00000000); + XSetForeground(data->display, data->stencil_gc, 0); #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE if (data->use_xdamage) { @@ -1229,7 +1229,7 @@ XFixesSetGCClipRegion(data->display, data->stencil_gc, 0, 0, None); } #endif - XSetForeground(data->display, data->stencil_gc, 0xFF); + XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF); XDrawPoints(data->display, data->stencil, data->stencil_gc, xpoints, xcount, CoordModeOrigin); @@ -1323,7 +1323,7 @@ drawable = data->stencil; gc = data->stencil_gc; - XSetForeground(data->display, data->stencil_gc, 0x00000000); + XSetForeground(data->display, data->stencil_gc, 0); #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE if (data->use_xdamage) XFixesSetGCClipRegion(data->display, data->stencil_gc, @@ -1336,7 +1336,7 @@ XFixesSetGCClipRegion(data->display, data->stencil_gc, 0, 0, None); #endif - XSetForeground(data->display, data->stencil_gc, 0xFF); + XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF); } else #endif @@ -1536,7 +1536,7 @@ renderer->blendMode != SDL_BLENDMODE_ADD && renderer->blendMode != SDL_BLENDMODE_MOD)) { - XSetForeground(data->display, data->stencil_gc, 0x00000000); + XSetForeground(data->display, data->stencil_gc, 0); #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE if (data->use_xdamage) XFixesSetGCClipRegion(data->display, data->stencil_gc, @@ -1549,7 +1549,7 @@ XFixesSetGCClipRegion(data->display, data->stencil_gc, 0, 0, None); #endif - XSetForeground(data->display, data->stencil_gc, 0xFF); + XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF); XDrawRectangles(data->display, data->stencil, data->stencil_gc, xrects, xcount); @@ -1695,35 +1695,35 @@ dstrect->y, srcrect->w, srcrect->h); } } - Picture src, mask, dst; + Picture mask; XRenderPictureAttributes attr; + const SDL_Rect *mrect; if(texture->blendMode == SDL_BLENDMODE_NONE) { - src = texturedata->picture; mask = None; - dst = data->drawable_pict; + mrect = srcrect; } - /*else if (texture->blendMode == SDL_BLENDMODE_MOD) { - src = data->drawable_pict; + else if (texture->blendMode == SDL_BLENDMODE_MOD) { + mask = data->stencil_pict; + mrect = dstrect; + } + else { mask = texturedata->picture; - dst = data->drawable_pict; - attr.alpha_map = mask; - }*/ - else { - src = texturedata->picture; - mask = texturedata->picture; - dst = data->drawable_pict; + mrect = srcrect; } if(srcrect->w == dstrect->w && srcrect->h == dstrect->h) { - /*if (texture->blendMode == SDL_BLENDMODE_MOD) { + if (texture->blendMode == SDL_BLENDMODE_MOD) { + XRenderComposite(data->display, PictOpSrc, data->drawable_pict, + texturedata->picture, data->stencil_pict, + dstrect->x, dstrect->y, srcrect->x, srcrect->y, + dstrect->x, dstrect->y, dstrect->w, dstrect->h); attr.component_alpha = True; - XRenderChangePicture(data->display, texturedata->picture, + XRenderChangePicture(data->display, data->stencil_pict, CPComponentAlpha, &attr); - XRenderChangePicture(data->display, src, CPAlphaMap, &attr); - }*/ - XRenderComposite(data->display, texturedata->blend_op, src, - mask, dst, srcrect->x, srcrect->y, - srcrect->x, srcrect->y, dstrect->x, dstrect->y, - srcrect->w, srcrect->h); + } + XRenderComposite(data->display, texturedata->blend_op, texturedata->picture, + mask, data->drawable_pict, srcrect->x, srcrect->y, + mrect->x, mrect->y, dstrect->x, dstrect->y, + dstrect->w, dstrect->h); } else { double xscale = ((double) dstrect->w) / srcrect->w; double yscale = ((double) dstrect->h) / srcrect->h; @@ -1733,19 +1733,22 @@ {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(xscale * yscale)}}}; XRenderSetPictureTransform(data->display, texturedata->picture, &xform); - /*if (texture->blendMode == SDL_BLENDMODE_MOD) { + if (texture->blendMode == SDL_BLENDMODE_MOD) { + XRenderComposite(data->display, PictOpSrc, data->drawable_pict, + texturedata->picture, data->stencil_pict, + dstrect->x, dstrect->y, srcrect->x, srcrect->y, + dstrect->x, dstrect->y, dstrect->w, dstrect->h); attr.component_alpha = True; - XRenderChangePicture(data->display, texturedata->picture, + XRenderChangePicture(data->display, data->stencil_pict, CPComponentAlpha, &attr); - XRenderChangePicture(data->display, src, CPAlphaMap, &attr); - }*/ + } XRenderSetPictureFilter(data->display, texturedata->picture, texturedata->filter, 0, 0); XRenderComposite(data->display, texturedata->blend_op, - src, mask, dst, - srcrect->x, srcrect->y, srcrect->x, srcrect->y, + texturedata->picture, mask, data->drawable_pict, + srcrect->x, srcrect->y, mrect->x, mrect->y, dstrect->x, dstrect->y, dstrect->w, dstrect->h); XTransform identity = {{ @@ -1754,14 +1757,11 @@ {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}}; XRenderSetPictureTransform(data->display, texturedata->picture, &identity); } - /*if (renderer->blendMode == SDL_BLENDMODE_MOD) { + if (renderer->blendMode == SDL_BLENDMODE_MOD) { attr.component_alpha = False; - XRenderChangePicture(data->display, texturedata->picture, + XRenderChangePicture(data->display, data->stencil_pict, CPComponentAlpha, &attr); - attr.alpha_map = None; - XRenderChangePicture(data->display, data->drawable_pict, - CPAlphaMap, &attr); - }*/ + } } else #endif