On 11/23/2015 07:02 PM, Frediano Ziglio wrote:
From: Marc-André Lureau <[email protected]>
---
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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/spice-devel