Would it not be too slow with many objects since cairo needs to compute the geometry to extract a rectangle? Something related I would really like is cairo_end_damage_tracking_mask
that returns a hit mask for intersection testing (eg. mouse click).<br>I have always though cairo could do with a semi-official separate minimal scenegraph since the above scenario is so common. <br><br>~Gerdus<br><br><div class="gmail_quote">
On Thu, May 1, 2008 at 2:58 AM, Soeren Sandmann &lt;<a href="mailto:sandmann@daimi.au.dk">sandmann@daimi.au.dk</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
In a canvas/toolkit type project I am playing around with, I need the<br>
ability to track the &#39;damage&#39; done by painting with a cairo context.<br>
<br>
This is useful to generate repaint areas, ie., the area that the<br>
application needs to repaint. When something happens that causes a<br>
canvas item to change it appearance, damage tracking would allow the<br>
application to simply do this:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;static void<br>
 &nbsp; &nbsp; &nbsp; &nbsp;invalidate (Item *item, cairo_t *cr)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cairo_begin_damage_tracking (cr);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;paint the item&gt;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;damaged = cairo_end_damage_tracking (cr);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;add_to_repaint_region (damaged);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;free (damaged);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;void<br>
 &nbsp; &nbsp; &nbsp; &nbsp;on_event ()<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cairo_t *cr = create_cr();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Invalidate old position */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;invalidate (item, cr);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;update item information&gt;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Invalidate new position */<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;invalidate (item, cr);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cairo_destroy();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
The big benefit is that this frees the application from keeping track<br>
of the exact region that is covering the item. Instead it can just<br>
compute it as needed.<br>
<br>
Currently the best an application can do is call<br>
cairo_stroke/fill_extents() after before each paint operation, but (a)<br>
this is inconvenient, (b) the extent rectangles are too pessimistic in<br>
many cases, and (c) it may not be possible to do if the painting is<br>
being done by a library.<br>
<br>
So I am proposing this new API:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;void &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cairo_begin_damage_tracking (cr);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;cairo_rectangle_list_t * &nbsp; &nbsp;cairo_end_damage_tracking (cr);<br>
<br>
Cairo would keep track of a stack of rectangle lists corresponding to<br>
the nesting level. Whenever cairo_end_damage_tracking() is called, a<br>
the topmost list is returned after a copy of it was unioned with the<br>
next list on the stack.<br>
<br>
Open question: In the proposal above, nothing is actually painted when<br>
tracking damage. I think it could potentially be useful to allow<br>
damage tracking and painting to go on at the same time, say for<br>
applications that would like to keep track of the last thing they<br>
painted.<br>
<br>
A way to accomplish that would be to simply have<br>
begin_damage_tracking() not turn off painting, but then also provide<br>
begin/end_disable_painting() calls.<br>
<br>
<br>
Soren<br>
_______________________________________________<br>
cairo mailing list<br>
<a href="mailto:cairo@cairographics.org">cairo@cairographics.org</a><br>
<a href="http://lists.cairographics.org/mailman/listinfo/cairo" target="_blank">http://lists.cairographics.org/mailman/listinfo/cairo</a><br>
</blockquote></div><br>