<br><br><div class="gmail_quote">2011/6/20 Andrea Canciani <span dir="ltr">&lt;<a href="mailto:ranma42@gmail.com">ranma42@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Mon, Jun 20, 2011 at 8:10 AM, Taekyun Kim &lt;<a href="mailto:podain77@gmail.com">podain77@gmail.com</a>&gt; wrote:<br>
&gt; Thanks for the replay.<br>
&gt;<br>
&gt;&gt; Basically when you use a Bounded operator, you are not touching anything<br>
&gt;&gt; outside the extents of your mask, while an XRender operator can change the<br>
&gt;&gt; destination even outside the mask.<br>
&gt;&gt; For example if you do an &quot;IN&quot; operation, everything outside the mask but<br>
&gt;&gt; inside the clip becomes transparent.<br>
&gt;<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; The equation which follows from the description is:<br>
&gt;&gt; dst&#39; = ((src IN mask) OP dst) LERP_clip dst<br>
&gt;&gt;<br>
&gt;&gt; In particular, it explains the (src IN mask) part, i.e.<br>
&gt;&gt; the source is cleared outside the mask.<br>
&gt;<br>
&gt; Ok, now I clearly understand why CLEAR and SOURCE should be explicitly<br>
&gt; bounded by mask. If (zero OP dst) == dst, we can classify these operators as<br>
&gt; &quot;Any&quot; (same for both bounded and unbounded interpretation). For remaining 4<br>
&gt; unbounded operators, result of compositing zero with dst is always zero i.e.<br>
&gt; (zero OP dst) == zero, where OP = IN, OUT, DEST_IN, DEST_ATOP.<br>
&gt; So following equation should hold for 4 unbounded operators.<br>
&gt;     dst = (src IN mask) OP dst (where mask is allowed)<br>
&gt;     dst = zero (where mask is not allowed)<br>
<br>
</div>I&#39;m not sure about the meaning of &quot;mask is allowed&quot;. Is it referred to clipping?<br>
If you assume no clipping, the formula for unbounded ops is simply:<br>
<div class="im">dst&#39; = (src IN mask) OP dst<br>
</div>no matter what the mask is.<br>
Where you are clipped away, no change is performed, so dst&#39; = dst.<br>
<div class="im"><br></div></blockquote><div><br></div><div>Sorry for confusion. I assumed no clipping. Because zero OP dst is always zero for unbounded ops, dst = zero also should hold. So fast paths which do not use temporary mask can safely fixup unbounded ops by just clearing dst where geometry is not drawn. If we take clipping into account, result would be LERP between the above unclipped result and dst. That&#39;s what I understand for current implementation of image backend functions. So everything is clear now. Thank you for the kind explanation.</div>
<meta http-equiv="content-type" content="text/html; charset=utf-8"><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">
&gt;<br>
&gt;&gt;<br>
&gt;&gt; &gt; 3. Limit boxes<br>
&gt;&gt; &gt; Boxes, traps, polygon can have there limit boxes. I thought the boxes<br>
&gt;&gt; &gt; should<br>
&gt;&gt; &gt; be disjoint,<br>
&gt;&gt; &gt; because I couldn&#39;t find any handling of overlapping boxes. Is this true?<br>
&gt;&gt;<br>
&gt;&gt; No, overlappping boxes are handled by the tessellator and/or the<br>
&gt;&gt; rasterizer.<br>
&gt;<br>
&gt; I used the term &quot;boxes&quot; referring to the &quot;limit boxes&quot;. I know that boxes<br>
&gt;  (not limit boxes) are tessellated according to the fill rule by<br>
&gt; cairo_bentley_ottmann_tessellate_boxes(). But I couldn&#39;t find any accessing<br>
&gt; to limits and num_limits inside of tessellator code. Instead, in case of<br>
&gt; polygon, an edge is clipped with each of limit boxes before it is added. So<br>
&gt; if the limit boxes should be regarded as a set of rectangular paths rather<br>
&gt; than rectangular region, we have to consider the fill rule of the limit<br>
&gt; boxes. But edge clipping does not consider the fill rule of the limit boxes.<br>
&gt; This is also same for cairo_traps_t. So, I concluded that limit boxes should<br>
&gt; be disjoint (regional representation) so that we can ignore the fill rule.<br>
<br>
</div>Sorry, I misunderstood your question.<br>
Yes, IIRC limit boxes are assumed to be disjoint.<br>
<br>
Side note:<br>
Skimming through the cairo-polygon code made me wonder if the<br>
implementation of the fill code is actually correct...<br>
To me it looks like there might be problems if an edge is clipped away.<br>
I&#39;ll look deeper into this and try to prepare a testcase.<font color="#888888"><br>
</font></blockquote></div><br><div>I&#39;m not sure but it seems that _add_clipped_edge() function can cause problems. If an edge is horizontally fully outside, it will be reduced to a vertical edge more than twice resulting incorrect even-odd or winding count.</div>
<div><div><div><div><br>-- <br>Best Regards,<div>Taekyun Kim</div><br>
</div></div></div></div>