# HG changeset patch # User Sunny Sachanandani # Date 1280749449 -19800 # Node ID 02895e9c796b3bc68a698d0ddaf8f10d52dccf14 # Parent 44fd1f0b895a287ef788fb82f3ed32d293770e13 Added some comments. diff -r 44fd1f0b895a -r 02895e9c796b src/video/x11/SDL_x11render.c --- a/src/video/x11/SDL_x11render.c Mon Aug 02 11:13:40 2010 +0530 +++ b/src/video/x11/SDL_x11render.c Mon Aug 02 17:14:09 2010 +0530 @@ -1886,6 +1886,8 @@ Picture src, mask; XRenderPictureAttributes attr; const SDL_Rect *mrect; + /* mrect is the rectangular area of the mask + * picture that is aligned with the source. */ if (texture->modMode == SDL_TEXTUREMODULATE_NONE) { src = texturedata->picture; @@ -1901,11 +1903,16 @@ } else if (texture->blendMode == SDL_BLENDMODE_MOD) { + /* SDL_BLENDMODE_MOD requires a temporary buffer + * i.e. stencil_pict */ mask = data->stencil_pict; mrect = dstrect; } else { + /* This trick allows on-the-fly multiplication + * of the src color channels with it's alpha + * channel. */ mask = src; mrect = srcrect; } @@ -1925,6 +1932,7 @@ mrect->x, mrect->y, dstrect->x, dstrect->y, dstrect->w, dstrect->h); } else { + /* The transformation is from the dst to src picture. */ double xscale = ((double) srcrect->w) / dstrect->w; double yscale = ((double) srcrect->h) / dstrect->h; XTransform xform = {{ @@ -1933,16 +1941,20 @@ {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(xscale * yscale)}}}; XRenderSetPictureTransform(data->display, src, &xform); + /* Black magic follows. */ if (texture->blendMode == SDL_BLENDMODE_MOD) { + /* Copy the dst to a temp buffer. */ XRenderComposite(data->display, PictOpSrc, data->drawable_pict, src, data->stencil_pict, dstrect->x, dstrect->y, srcrect->x, srcrect->y, dstrect->x, dstrect->y, dstrect->w, dstrect->h); + /* Set the compnent alpha flag on the temp buffer. */ attr.component_alpha = True; XRenderChangePicture(data->display, data->stencil_pict, CPComponentAlpha, &attr); } + /* Set the picture filter only if a scaling mode is set. */ if (texture->scaleMode != SDL_TEXTURESCALEMODE_NONE) { XRenderSetPictureFilter(data->display, src, texturedata->filter, 0, 0); @@ -1952,14 +1964,16 @@ src, mask, data->drawable_pict, srcrect->x, srcrect->y, mrect->x, mrect->y, dstrect->x, dstrect->y, dstrect->w, dstrect->h); - + /* Set the texture transformation back to the identity matrix. */ XTransform identity = {{ {XDoubleToFixed(1), XDoubleToFixed(0), XDoubleToFixed(0)}, {XDoubleToFixed(0), XDoubleToFixed(1), XDoubleToFixed(0)}, {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}}; XRenderSetPictureTransform(data->display, src, &identity); } - + + /* Reset the component alpha flag only when + * the blending mode is SDL_BLENDMODE_MOD. */ if (renderer->blendMode == SDL_BLENDMODE_MOD) { attr.component_alpha = False; XRenderChangePicture(data->display, data->stencil_pict,