Question about XRender specification

Helge Bahmann hcb at chaoticmind.net
Tue Apr 8 13:28:23 PDT 2008


> Testcase:
> 			XTrapezoid trap[2];
> 				trap[0].top=10<<16;
> 				trap[0].bottom=80<<16;
> 				trap[0].left.p1.x=30<<16; trap[0].left.p1.y=0<<16;
> 				trap[0].left.p2.x=20<<16; trap[0].left.p2.y=90<<16;
> 				trap[0].right.p1.x=XDoubleToFixed(100); trap[0].right.p1.y=0<<16;
> 				trap[0].right.p2.x=XDoubleToFixed(90); trap[0].right.p2.y=90<<16;
>
>
> 				trap[1].top=XDoubleToFixed(10);
> 				trap[1].bottom=80<<16;
> 				trap[1].left.p1.x=XDoubleToFixed(100); trap[1].left.p1.y=0<<16;
> 				trap[1].left.p2.x=XDoubleToFixed(90); trap[1].left.p2.y=90<<16;
> 				trap[1].right.p1.x=160<<16; trap[1].right.p1.y=0<<16;
> 				trap[1].right.p2.x=150<<16; trap[1].right.p2.y=90<<16;
>
> 				XRenderCompositeTrapezoids(display,
> 					PictOpOver, red_transp, picture, 0,
> 					0, 0, &trap, 2);

The problem is actually quite easy to explain -- let's assume one pixel is 
covered by 1/2 by each of the trapezoids, then alpha for that pixel=0.5 for 
each of the trapezoids

the way you are calling, they are drawn independently, this means the first 
trapezoid covers the pixel by 1/2, the second gets drawn over and now the 
pixel is covered by 3/4 and NOT 1 !

The solution is to use PictOpDisjointOver; possibly to have to composite your 
figure into a temporary mask and then use this pre-composited shape in a 
second rendering step

hope that helps
Helge



More information about the xorg mailing list