Hi,
>
> So what I think you want to achieve is:
>
> dst = a * srcA + (1-a) * srcB
yes, that's my intension
>
> which can be acheived (and hitting the accelerated paths) with:
>
> Picture a = XRenderCreateSolidFill(dpy, &(XRenderColor){.alpha = 0xffff *
> Fade});
> Picture ia = XRenderCreateSolidFill(dpy, &(XRenderColor){.alpha = 0xffff *
> (1-Fade)});
> XRenderComposite(dpy, PictOpSrc, srcA, a, dst, 0, 0, 0, 0, 0, 0, width,
> height);
> XRenderComposite(dpy, PictOpAdd, srcB, ia, dst, 0, 0, 0, 0, 0, 0, width,
> height);
> XRenderFreePicture(dpy, ia);
> XRenderFreePicture(dpy, a);
> -Chris
>
That work's much better (and avoids the crash). I thought the third parameter
of XRenderComposite() is something like a clipmask (after reading
http://www.x.org/releases/current/doc/renderproto/renderproto.txt), but it is
the missing multiplier.
I will use your approach.
Thank you very much.
Peter
Anyway, I wrote a little programm to reproduce the bug.
/******************************************************************************/
/******************************************************************************/
#include <stdint.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
/******************************************************************************/
/******************************************************************************/
int main(int argc, char *argv[])
{
const char *Host = (argc == 2) ? argv[1] : getenv("DISPLAY") ;
if(Host != NULL) {
Display *Dpy = XOpenDisplay(Host) ;
if(Dpy != NULL) {
Window Root = RootWindowOfScreen(DefaultScreenOfDisplay(Dpy)) ;
Pixmap s = XCreatePixmap(Dpy, Root, 100, 100, 32) ;
Pixmap d = XCreatePixmap(Dpy, Root, 100, 100, 32) ;
Pixmap Map = XCreatePixmap(Dpy, Root, 1, 1, 8) ;
XRenderPictFormat *Format32 = XRenderFindStandardFormat(Dpy,
PictStandardARGB32) ;
XRenderPictFormat *Format8 = XRenderFindStandardFormat(Dpy,
PictStandardA8) ;
uint16_t v = 0x8000 ;
XRenderColor c = {.red = v, .green = v, .blue = v, .alpha = v} ;
XRenderPictureAttributes Rep = {.repeat = RepeatNormal} ;
Picture Alpha = XRenderCreatePicture(Dpy, Map, Format8,
CPRepeat, &Rep) ;
Picture Src = XRenderCreatePicture(Dpy, s, Format32, 0, NULL) ;
Picture Dest = XRenderCreatePicture(Dpy, d, Format32, 0, NULL) ;
XRenderPictureAttributes Att = {.alpha_map = Alpha} ;
XRenderFillRectangle(Dpy, PictOpSrc, Alpha, &c, 0, 0, 1, 1) ;
XRenderChangePicture(Dpy, Src, CPAlphaMap, &Att) ;
XRenderChangePicture(Dpy, Dest, CPAlphaMap, &Att) ;
XRenderComposite(Dpy, PictOpClear, Src, None, Dest,
0, 0, 0, 0, 0, 0, 100, 100) ;
XSync(Dpy, False) ;
XRenderFreePicture(Dpy, Dest) ;
XRenderFreePicture(Dpy, Src) ;
XRenderFreePicture(Dpy, Alpha) ;
XFreePixmap(Dpy, s) ;
XFreePixmap(Dpy, d) ;
XCloseDisplay(Dpy) ;
}
}
return(0) ;
}
_______________________________________________
[email protected]: X.Org support
Archives: http://lists.freedesktop.org/archives/xorg
Info: http://lists.freedesktop.org/mailman/listinfo/xorg
Your subscription address: [email protected]