mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-03 07:02:25 +00:00
display: reuse code in display_channel_draw_until
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
This commit is contained in:
parent
180b9f27df
commit
19f92e9eb8
@ -1305,20 +1305,18 @@ static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *l
|
||||
} while (now != last);
|
||||
}
|
||||
|
||||
static Drawable* current_find_intersects_rect(Ring *current, const SpiceRect *area)
|
||||
static Drawable* current_find_intersects_rect(Ring *current, RingItem *from,
|
||||
const SpiceRect *area)
|
||||
{
|
||||
Ring *ring;
|
||||
RingItem *ring_item;
|
||||
RingItem *it;
|
||||
QRegion rgn;
|
||||
Drawable *last = NULL;
|
||||
|
||||
ring = current;
|
||||
ring_item = ring;
|
||||
region_init(&rgn);
|
||||
region_add(&rgn, area);
|
||||
|
||||
while ((ring_item = ring_next(ring, ring_item))) {
|
||||
Drawable *now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
|
||||
for (it = from ? from : ring_next(current, current); it != NULL; it = ring_next(current, it)) {
|
||||
Drawable *now = SPICE_CONTAINEROF(it, Drawable, surface_list_link);
|
||||
if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
|
||||
last = now;
|
||||
break;
|
||||
@ -1334,7 +1332,7 @@ static Drawable* current_find_intersects_rect(Ring *current, const SpiceRect *ar
|
||||
* than 'last' (exclusive).
|
||||
* FIXME: merge with display_channel_draw()?
|
||||
*/
|
||||
void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, int surface_id,
|
||||
void display_channel_draw_until(DisplayChannel *display, const SpiceRect *area, int surface_id,
|
||||
Drawable *last)
|
||||
{
|
||||
RedSurface *surface;
|
||||
@ -1342,7 +1340,6 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i
|
||||
Ring *ring;
|
||||
RingItem *ring_item;
|
||||
Drawable *now;
|
||||
QRegion rgn;
|
||||
|
||||
spice_return_if_fail(last);
|
||||
spice_return_if_fail(ring_item_is_linked(&last->list_link));
|
||||
@ -1367,33 +1364,15 @@ void display_channel_draw_till(DisplayChannel *display, const SpiceRect *area, i
|
||||
}
|
||||
}
|
||||
|
||||
if (!surface_last) {
|
||||
if (!surface_last)
|
||||
return;
|
||||
}
|
||||
|
||||
ring = &surface->current_list;
|
||||
ring_item = &surface_last->surface_list_link;
|
||||
|
||||
region_init(&rgn);
|
||||
region_add(&rgn, area);
|
||||
|
||||
// find the first older drawable that intersects with the area
|
||||
do {
|
||||
now = SPICE_CONTAINEROF(ring_item, Drawable, surface_list_link);
|
||||
if (region_intersects(&rgn, &now->tree_item.base.rgn)) {
|
||||
surface_last = now;
|
||||
break;
|
||||
}
|
||||
} while ((ring_item = ring_next(ring, ring_item)));
|
||||
|
||||
region_destroy(&rgn);
|
||||
|
||||
if (!surface_last) {
|
||||
last = current_find_intersects_rect(&surface->current_list,
|
||||
&surface_last->surface_list_link, area);
|
||||
if (!last)
|
||||
return;
|
||||
}
|
||||
|
||||
draw_until(display, surface, surface_last);
|
||||
|
||||
draw_until(display, surface, last);
|
||||
surface_update_dest(surface, area);
|
||||
}
|
||||
|
||||
@ -1412,7 +1391,7 @@ void display_channel_draw(DisplayChannel *display, const SpiceRect *area, int su
|
||||
|
||||
surface = &display->surfaces[surface_id];
|
||||
|
||||
last = current_find_intersects_rect(&surface->current_list, area);
|
||||
last = current_find_intersects_rect(&surface->current_list, NULL, area);
|
||||
if (last)
|
||||
draw_until(display, surface, last);
|
||||
|
||||
|
||||
@ -262,7 +262,7 @@ void display_channel_create_surface (DisplayCha
|
||||
void display_channel_draw (DisplayChannel *display,
|
||||
const SpiceRect *area,
|
||||
int surface_id);
|
||||
void display_channel_draw_till (DisplayChannel *display,
|
||||
void display_channel_draw_until (DisplayChannel *display,
|
||||
const SpiceRect *area,
|
||||
int surface_id,
|
||||
Drawable *last);
|
||||
|
||||
@ -405,7 +405,7 @@ static void dcc_detach_stream_gracefully(DisplayChannelClient *dcc,
|
||||
stream_id, stream->current != NULL);
|
||||
rect_debug(&upgrade_area);
|
||||
if (update_area_limit) {
|
||||
display_channel_draw_till(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
|
||||
display_channel_draw_until(DCC_TO_DC(dcc), &upgrade_area, 0, update_area_limit);
|
||||
} else {
|
||||
display_channel_draw(DCC_TO_DC(dcc), &upgrade_area, 0);
|
||||
}
|
||||
@ -1524,8 +1524,7 @@ static void red_add_lossless_drawable_dependencies(RedChannelClient *rcc,
|
||||
} else {
|
||||
sync_rendered = FALSE;
|
||||
for (i = 0; i < num_deps; i++) {
|
||||
display_channel_draw_till(display, deps_areas[i],
|
||||
deps_surfaces_ids[i], item);
|
||||
display_channel_draw_until(display, deps_areas[i], deps_surfaces_ids[i], item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user