Functions that check the equality of a patch, brush, etc are moved the display channel source file to prepare for moving the surfaces to the display channel. --- server/display-channel.h | 89 +++++++++++++++++++++++++++++++++++++++++++++ server/red_worker.c | 95 ++---------------------------------------------- 2 files changed, 92 insertions(+), 92 deletions(-) diff --git a/server/display-channel.h b/server/display-channel.h index 8c1648b..7bb9c14 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -20,6 +20,7 @@ #include <setjmp.h> +#include "common/rect.h" #include "red_worker.h" #include "reds_stream.h" #include "cache-item.h" @@ -370,6 +371,94 @@ void display_channel_compress_stats_print (const Disp void display_channel_compress_stats_reset (DisplayChannel *display); void display_channel_drawable_unref (DisplayChannel *display, Drawable *drawable); +static inline int is_equal_path(SpicePath *path1, SpicePath *path2) +{ + SpicePathSeg *seg1, *seg2; + int i, j; + + if (path1->num_segments != path2->num_segments) + return FALSE; + + for (i = 0; i < path1->num_segments; i++) { + seg1 = path1->segments[i]; + seg2 = path2->segments[i]; + + if (seg1->flags != seg2->flags || + seg1->count != seg2->count) { + return FALSE; + } + for (j = 0; j < seg1->count; j++) { + if (seg1->points[j].x != seg2->points[j].x || + seg1->points[j].y != seg2->points[j].y) { + return FALSE; + } + } + } + + return TRUE; +} + +// partial imp +static inline int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2) +{ + return b1->type == b2->type && + b1->type == SPICE_BRUSH_TYPE_SOLID && + b1->u.color == b2->u.color; +} + +// partial imp +static inline int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2) +{ + return a1->flags == a2->flags && + a1->style_nseg == a2->style_nseg && + a1->style_nseg == 0; +} + +// partial imp +static inline int is_same_geometry(Drawable *d1, Drawable *d2) +{ + if (d1->red_drawable->type != d2->red_drawable->type) { + return FALSE; + } + + switch (d1->red_drawable->type) { + case QXL_DRAW_STROKE: + return is_equal_line_attr(&d1->red_drawable->u.stroke.attr, + &d2->red_drawable->u.stroke.attr) && + is_equal_path(d1->red_drawable->u.stroke.path, + d2->red_drawable->u.stroke.path); + case QXL_DRAW_FILL: + return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox); + default: + return FALSE; + } +} + +static inline int is_same_drawable(Drawable *d1, Drawable *d2) +{ + if (!is_same_geometry(d1, d2)) { + return FALSE; + } + + switch (d1->red_drawable->type) { + case QXL_DRAW_STROKE: + return is_equal_brush(&d1->red_drawable->u.stroke.brush, + &d2->red_drawable->u.stroke.brush); + case QXL_DRAW_FILL: + return is_equal_brush(&d1->red_drawable->u.fill.brush, + &d2->red_drawable->u.fill.brush); + default: + return FALSE; + } +} + +static inline int is_primary_surface(DisplayChannel *display, uint32_t surface_id) +{ + if (surface_id == 0) { + return TRUE; + } + return FALSE; +} #endif /* DISPLAY_CHANNEL_H_ */ diff --git a/server/red_worker.c b/server/red_worker.c index 8282b31..a2ed49b 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -563,14 +563,6 @@ QXLInstance* red_worker_get_qxl(RedWorker *worker) return worker->qxl; } -static inline int is_primary_surface(DisplayChannel *display, uint32_t surface_id) -{ - if (surface_id == 0) { - return TRUE; - } - return FALSE; -} - static int validate_drawable_bbox(RedWorker *worker, RedDrawable *drawable) { DrawContext *context; @@ -1417,87 +1409,6 @@ static inline void __current_add_drawable(RedWorker *worker, Drawable *drawable, drawable->refs++; } -static int is_equal_path(RedWorker *worker, SpicePath *path1, SpicePath *path2) -{ - SpicePathSeg *seg1, *seg2; - int i, j; - - if (path1->num_segments != path2->num_segments) - return FALSE; - - for (i = 0; i < path1->num_segments; i++) { - seg1 = path1->segments[i]; - seg2 = path2->segments[i]; - - if (seg1->flags != seg2->flags || - seg1->count != seg2->count) { - return FALSE; - } - for (j = 0; j < seg1->count; j++) { - if (seg1->points[j].x != seg2->points[j].x || - seg1->points[j].y != seg2->points[j].y) { - return FALSE; - } - } - } - - return TRUE; -} - -// partial imp -static int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2) -{ - return b1->type == b2->type && - b1->type == SPICE_BRUSH_TYPE_SOLID && - b1->u.color == b2->u.color; -} - -// partial imp -static int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2) -{ - return a1->flags == a2->flags && - a1->style_nseg == a2->style_nseg && - a1->style_nseg == 0; -} - -// partial imp -static int is_same_geometry(RedWorker *worker, Drawable *d1, Drawable *d2) -{ - if (d1->red_drawable->type != d2->red_drawable->type) { - return FALSE; - } - - switch (d1->red_drawable->type) { - case QXL_DRAW_STROKE: - return is_equal_line_attr(&d1->red_drawable->u.stroke.attr, - &d2->red_drawable->u.stroke.attr) && - is_equal_path(worker, d1->red_drawable->u.stroke.path, - d2->red_drawable->u.stroke.path); - case QXL_DRAW_FILL: - return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox); - default: - return FALSE; - } -} - -static int is_same_drawable(RedWorker *worker, Drawable *d1, Drawable *d2) -{ - if (!is_same_geometry(worker, d1, d2)) { - return FALSE; - } - - switch (d1->red_drawable->type) { - case QXL_DRAW_STROKE: - return is_equal_brush(&d1->red_drawable->u.stroke.brush, - &d2->red_drawable->u.stroke.brush); - case QXL_DRAW_FILL: - return is_equal_brush(&d1->red_drawable->u.fill.brush, - &d2->red_drawable->u.fill.brush); - default: - return FALSE; - } -} - static void detach_stream(DisplayChannel *display, Stream *stream, int detach_sized) { @@ -2282,7 +2193,7 @@ static inline int red_current_add_equal(RedWorker *worker, DrawItem *item, TreeI switch (item->effect) { case QXL_EFFECT_REVERT_ON_DUP: - if (is_same_drawable(worker, drawable, other_drawable)) { + if (is_same_drawable(drawable, other_drawable)) { DisplayChannelClient *dcc; DrawablePipeItem *dpi; @@ -2324,7 +2235,7 @@ static inline int red_current_add_equal(RedWorker *worker, DrawItem *item, TreeI } break; case QXL_EFFECT_OPAQUE_BRUSH: - if (is_same_geometry(worker, drawable, other_drawable)) { + if (is_same_geometry(drawable, other_drawable)) { __current_add_drawable(worker, drawable, &other->siblings_link); remove_drawable(worker, other_drawable); red_pipes_add_drawable(worker, drawable); @@ -2332,7 +2243,7 @@ static inline int red_current_add_equal(RedWorker *worker, DrawItem *item, TreeI } break; case QXL_EFFECT_NOP_ON_DUP: - if (is_same_drawable(worker, drawable, other_drawable)) { + if (is_same_drawable(drawable, other_drawable)) { return TRUE; } break; -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel