On 11/23/2015 07:02 PM, Frediano Ziglio wrote:
From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- server/display-channel.c | 51 ++++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/server/display-channel.c b/server/display-channel.c index a78f86a..ab70947 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -1299,6 +1299,30 @@ static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *l } while (now != last); } +static Drawable* current_find_intersects_rect(Ring *current, const SpiceRect *area)
s/current/ring/
+{ + Ring *ring;
No need another ring here.
+ RingItem *ring_item; + QRegion rgn; + Drawable *last = NULL, *now; + + ring = current; + ring_item = ring; + region_init(&rgn); + region_add(&rgn, area); + + while ((ring_item = ring_next(ring, ring_item))) { + now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link); + if (region_intersects(&rgn, &now->tree_item.base.rgn)) { + last = now; + break; + } + } + + region_destroy(&rgn); + return last; +} + /* * Renders drawables for updating the requested area, but only drawables that are older * than 'last' (exclusive). @@ -1376,10 +1400,8 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int surface_id) { RedSurface *surface; - Ring *ring; - RingItem *ring_item; - QRegion rgn; - Drawable *last, *now; + Drawable *last;
btw, 'last' is really 'first intersecting drawable'
+ spice_debug("surface %d: area ==>", surface_id); rect_debug(area); @@ -1390,23 +1412,10 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su surface = &display->surfaces[surface_id]; - last = NULL; - ring = &surface->current_list; - ring_item = ring; - - region_init(&rgn); - region_add(&rgn, area); - while ((ring_item = ring_next(ring, ring_item))) { - now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link); - if (region_intersects(&rgn, &now->tree_item.base.rgn)) { - last = now; - break; - } - } - region_destroy(&rgn); - - if (last) - draw_until(display, surface, last); + last = current_find_intersects_rect(&surface->current_list, area); + if (!last) + return;
Note that this changes the behavior. Before if !last , surface_update_dest is still being called. Regards, Uri.
+ draw_until(display, surface, last); surface_update_dest(surface, area); }
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel