[Spice-devel] [PATCH 2/5] worker: Move drawable utility functions to display channel
Fabiano FidĂȘncio
fidencio at redhat.com
Tue Nov 10 15:32:53 PST 2015
On Tue, Nov 10, 2015 at 9:41 PM, Jonathon Jongsma <jjongsma at redhat.com> wrote:
> 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.
"equality of a patch" -> "equality of a path"
> ---
> 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
Looks good, ACK!
More information about the Spice-devel
mailing list