<div dir="ltr">Hi Pekka,<div><br></div><div>Can't be this solved by creating a subimage based on the input image and the viewport? This way you can basically use the same pipeline. I'm not sure, however, if I fully understand the issue.</div><div><br></div><div class="gmail_extra">Cheers,</div><div class="gmail_extra">Petr<br clear="all"><div><div class="gmail_signature"><br></div></div><div class="gmail_quote">On Tue, Mar 3, 2015 at 8:49 AM, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, 2 Mar 2015 17:33:16 +0200<br>
Siarhei Siamashka <<a href="mailto:siarhei.siamashka@gmail.com">siarhei.siamashka@gmail.com</a>> wrote:<br>
<br>
> On Mon, 2 Mar 2015 14:47:01 +0200<br>
> Pekka Paalanen <<a href="mailto:ppaalanen@gmail.com">ppaalanen@gmail.com</a>> wrote:<br>
><br>
> > Hi,<br>
> ><br>
> > I've been trying to use source clipping in Weston's Pixman-renderer,<br>
> > and I found something that seems strange.<br>
> ><br>
> > The scenario is that I have:<br>
> > - source clip in source image coordinates<br>
> > - transformation (matrix)<br>
> > - destination clip in destination coordinates<br>
> > - potentially a mask (to apply global alpha<br>
> ><br>
> > Then call pixman_image_composite32() to render.<br>
> ><br>
> > Apart from the source clip everything works fine. Some special cases<br>
> > really need a source clip, so I'm looking into that. I finally realized<br>
> > I need all three to actually get any effect:<br>
> ><br>
> >     pixman_image_set_clip_region32(ps->image, &buffer_region);<br>
> >     pixman_image_set_source_clipping(ps->image, 1);<br>
> >     pixman_image_set_has_client_clip(ps->image, 1);<br>
> ><br>
> > It seems that is as designed, that's ok.<br>
> ><br>
> > The strange thing is that the source clip seems to be done in<br>
> > the destination, not in the source. Is this expected?<br>
><br>
> Yes, this is expected. Søren can probably provide better explanations<br>
> about the rationale. But here are some old links:<br>
><br>
> <a href="http://lists.cairographics.org/archives/xorg-devel/2009-May/000819.html" target="_blank">http://lists.cairographics.org/archives/xorg-devel/2009-May/000819.html</a><br>
> <a href="http://lists.cairographics.org/archives/xorg-devel/2009-May/000820.html" target="_blank">http://lists.cairographics.org/archives/xorg-devel/2009-May/000820.html</a><br>
> <a href="http://cgit.freedesktop.org/pixman/commit/?id=78ca4eea6467dbb6b9da1198b9526750a0a8dca3" target="_blank">http://cgit.freedesktop.org/pixman/commit/?id=78ca4eea6467dbb6b9da1198b9526750a0a8dca3</a><br>
<br>
</div></div>Hi Siarhei,<br>
<br>
thank you for the fast response. I did suspect the Pixman API behaviour<br>
to be intricately tied to something in X11, and those pointers confirm<br>
it. Now I know what the API intends.<br>
<span class=""><br>
> > Using source clip looks like it replaces the destination clip, instead<br>
> > of clipping in the source image coordinate space. I'm testing with<br>
> > Pixman 0.32.4.<br>
> ><br>
> > I would really need clipping both before and after the transformation.<br>
> > Is there a way to achieve that, or do I have to start looking into<br>
> > trapezoids or something? (I suppose I will next look into creating a<br>
> > mask image.)<br>
><br>
> Can you provide a bit more details about your exact use case?<br>
<br>
</span>Ok, this is the simplified case from Weston. There is a pixel buffer<br>
from a client (the window), a transformation that maps it to the output,<br>
and the output framebuffer. The transformation can be an arbitrary 3x3<br>
matrix, but the most complicated thing we use so far is rotating the<br>
window on the xy-plane by an arbitrary amount.<br>
<br>
We use the destination clipping on the framebuffer to avoid too much<br>
useless compositing outside the source image (window). The clip<br>
(pixman_region32_t) is essentially the intersection of the window's<br>
boundingbox on the output and output damage we want to repaint. IOW, it<br>
is an approximation. Currently we rely on sampling outside the source<br>
image to produce (0,0,0,0) or skip compositing those pixels.<br>
<br>
This works fine as long as the whole pixel buffer from the client is to<br>
be used.<br>
<br>
However, the client can use wl_viewport protocol interface to say, that<br>
the compositor needs to use only a sub-rectangle of the pixel buffer.<br>
If we don't have a complex transformation, we can transform the<br>
rectangle to output space correctly and do all the clipping in output<br>
space.<br>
<br>
If the transformation is complex, the rectangle in the client buffer<br>
space is no longer axis-aligned in the output space, so we cannot<br>
correctly transform it to output space. As we currently cannot do<br>
clipping in source space, this use case is bugged. We composite areas of<br>
the client buffer that should not be visible.<br>
<br>
So, we need to have axis-aligned rectangles (pixman_region32_t) in the<br>
source image space doing clipping to cut away the unwanted parts.<br>
<br>
The underlying the problem is that we need an intersection between<br>
axis-aligned and not-axis-aligned regions to compute the area we<br>
actually want to paint. For instance, Weston's GL-renderer does this by<br>
triangulating the intersection of every box vs. transformed box pair<br>
between the two pixman_region32_t's.<br>
<span class=""><br>
> In some cases, the source image clipping might be simulated by<br>
> just wrapping a rectangular area of an existing image as a new<br>
> pixman_image_t. And then using it as the source image in the<br>
> compositing operation.<br>
<br>
</span>That's an excellent idea! I will try that.<br>
<br>
Btw. I did already try using a mask image, but it seems the mask image<br>
is also given in the destination space wrt. transformation. Is that<br>
correct?<br>
<br>
<br>
Thanks,<br>
pq<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Pixman mailing list<br>
<a href="mailto:Pixman@lists.freedesktop.org">Pixman@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/pixman" target="_blank">http://lists.freedesktop.org/mailman/listinfo/pixman</a><br>
</div></div></blockquote></div><br></div></div>