[Spice-devel] [PATCH 18/18] display: factor out current_find_intersects_rect

Uri Lublin uril at redhat.com
Thu Nov 26 01:29:56 PST 2015


On 11/23/2015 07:02 PM, Frediano Ziglio wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>
> ---
>   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);
>   }
>



More information about the Spice-devel mailing list