winex11.drv: Implement FIXME in AlphaBlend

Roderick Colenbrander thunderbird2k at gmail.com
Wed Nov 4 12:20:00 CST 2009


Hi Peter,

I didn't see this patch before because I was away at that time. The
SourceConstantAlpha part looks correct to me. It might make sense to
calculate blendfn.SourceConstantAlpha / 255 before the loop, so that
it isn't recalculated each time.

The other half of your patch is a separate change and it would require
a separate patch. The part looks suspicious though. I don't understand
why you need special locking there.

Roderick

On Mon, Oct 26, 2009 at 4:39 PM, Peter Urbanec <winehq.org at urbanec.net> wrote:
>
>
> commit df78de34a06e32be9f37a3b34fe68e5b088a8578
> Author: Peter Urbanec <winehq.org at urbanec.net>
> Date:   Mon Oct 26 21:29:00 2009 +1100
>
>    Implement source alpha plus SourceConstantAlpha combined transparency.
>    Add DIB locking to prevent node icon rendering errors in Fusion composition flow views.
>
> diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
> index 90503bf..26dc262 100644
> --- a/dlls/winex11.drv/xrender.c
> +++ b/dlls/winex11.drv/xrender.c
> @@ -1956,9 +1956,6 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
>         return FALSE;
>     }
>
> -    if ((blendfn.AlphaFormat & AC_SRC_ALPHA) && blendfn.SourceConstantAlpha != 0xff)
> -        FIXME("Ignoring SourceConstantAlpha %d for AC_SRC_ALPHA\n", blendfn.SourceConstantAlpha);
> -
>     if(dib.dsBm.bmBitsPixel != 32) {
>         FIXME("not a 32 bpp dibsection\n");
>         return FALSE;
> @@ -1979,11 +1976,35 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
>
>     if (blendfn.AlphaFormat & AC_SRC_ALPHA)
>     {
> -        for(; y >= y2; y--)
> +        if (blendfn.SourceConstantAlpha == 0xff)
>         {
> -            memcpy(dstbits, (char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes + xSrc * 4,
> +            for(; y >= y2; y--)
> +            {
> +                memcpy(dstbits, (char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes + xSrc * 4,
>                    widthSrc * 4);
> -            dstbits += (top_down ? -1 : 1) * widthSrc;
> +                dstbits += (top_down ? -1 : 1) * widthSrc;
> +            }
> +        }
> +        else
> +        {
> +            /* Source alpha plus SourceConstantAlpha */
> +            for(; y >= y2; y--)
> +            {
> +                int x;
> +                DWORD *srcbits = (DWORD *)((char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes) + xSrc;
> +                for (x = 0; x < widthSrc; x++)
> +                {
> +                    DWORD argb = *srcbits++;
> +                    BYTE *s = (BYTE *) &argb;
> +                    s[0] = (s[0] * blendfn.SourceConstantAlpha) / 255;
> +                    s[1] = (s[1] * blendfn.SourceConstantAlpha) / 255;
> +                    s[2] = (s[2] * blendfn.SourceConstantAlpha) / 255;
> +                    s[3] = (s[3] * blendfn.SourceConstantAlpha) / 255;
> +                    *dstbits++ = argb;
> +                }
> +                if (top_down)  /* we traversed the row forward so we should go back by two rows */
> +                    dstbits -= 2 * widthSrc;
> +            }
>         }
>     }
>     else
> @@ -2006,6 +2027,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
>
>     }
>
> +    X11DRV_LockDIBSection( devDst, DIB_Status_GdiMod );
>     dst_pict = get_xrender_picture(devDst);
>
>     wine_tsx11_lock();
> @@ -2017,6 +2039,8 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
>     if(!src_format)
>     {
>         WARN("Unable to find a picture format supporting alpha, make sure X is running at 24-bit\n");
> +        wine_tsx11_unlock();
> +        X11DRV_UnlockDIBSection( devDst, TRUE );
>         return FALSE;
>     }
>
> @@ -2055,6 +2079,7 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
>     XDestroyImage(image);
>
>     wine_tsx11_unlock();
> +    X11DRV_UnlockDIBSection( devDst, TRUE );
>     HeapFree(GetProcessHeap(), 0, data);
>     return TRUE;
>  }
>
>
>
>



More information about the wine-devel mailing list