[Spice-devel] [PATCH 2/5] worker: Move drawable utility functions to display channel

Frediano Ziglio fziglio at redhat.com
Wed Nov 11 04:23:05 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!

Merged with the small typo fix

Frediano


More information about the Spice-devel mailing list