diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-07-08 12:43:33 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-07-08 12:43:33 +0200 |
commit | 31d2d6e4e485f1addece7139c82b4f3e64b1bd91 (patch) | |
tree | b7493ed75a5a5805023b2859809ad188ea8633d9 | |
parent | fe4f90210f492b8818af33dd1824c09295631c73 (diff) | |
download | spice-31d2d6e4e485f1addece7139c82b4f3e64b1bd91.tar.gz spice-31d2d6e4e485f1addece7139c82b4f3e64b1bd91.tar.xz spice-31d2d6e4e485f1addece7139c82b4f3e64b1bd91.zip |
Properly parse QXLLineAttrs.style
-rw-r--r-- | common/canvas_base.c | 2 | ||||
-rw-r--r-- | common/gdi_canvas.c | 3 | ||||
-rw-r--r-- | server/red_parse_qxl.c | 35 | ||||
-rw-r--r-- | server/red_worker.c | 33 | ||||
-rw-r--r-- | spice.proto | 2 | ||||
-rw-r--r-- | spice1.proto | 2 |
6 files changed, 29 insertions, 48 deletions
diff --git a/common/canvas_base.c b/common/canvas_base.c index a1378a09..6a0c09c3 100644 --- a/common/canvas_base.c +++ b/common/canvas_base.c @@ -3027,7 +3027,7 @@ static void canvas_draw_stroke(SpiceCanvas *spice_canvas, SpiceRect *bbox, dashed = 0; if (stroke->attr.flags & SPICE_LINE_FLAGS_STYLED) { - SPICE_FIXED28_4 *style = (SPICE_FIXED28_4*)SPICE_GET_ADDRESS(stroke->attr.style); + SPICE_FIXED28_4 *style = stroke->attr.style; int nseg; dashed = 1; diff --git a/common/gdi_canvas.c b/common/gdi_canvas.c index 9c520024..845ddd58 100644 --- a/common/gdi_canvas.c +++ b/common/gdi_canvas.c @@ -1590,9 +1590,8 @@ static void gdi_canvas_draw_text(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spi } } -static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_ADDRESS addr, int start_is_gap) +static uint32_t *gdi_get_userstyle(GdiCanvas *canvas, uint8_t nseg, SPICE_FIXED28_4* style, int start_is_gap) { - SPICE_FIXED28_4* style = (SPICE_FIXED28_4*)SPICE_GET_ADDRESS(addr); double offset = 0; uint32_t *local_style; int i; diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index ee099a03..85caa88a 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -557,24 +557,35 @@ static void red_put_rop3(SpiceRop3 *red) static void red_get_stroke_ptr(RedMemSlotInfo *slots, int group_id, SpiceStroke *red, QXLStroke *qxl) { - red->path = red_get_path(slots, group_id, qxl->path); - red->attr.flags = qxl->attr.flags; - if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) { - red->attr.style_nseg = qxl->attr.style_nseg; - red->attr.style = qxl->attr.style; - } else { - red->attr.style_nseg = 0; - red->attr.style = 0; - } - red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush); - red->fore_mode = qxl->fore_mode; - red->back_mode = qxl->back_mode; + red->path = red_get_path(slots, group_id, qxl->path); + red->attr.flags = qxl->attr.flags; + if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) { + int style_nseg; + uint8_t *buf; + + style_nseg = qxl->attr.style_nseg; + red->attr.style = spice_malloc_n(style_nseg, sizeof(SPICE_FIXED28_4)); + red->attr.style_nseg = style_nseg; + ASSERT(qxl->attr.style); + buf = (uint8_t *)get_virt(slots, qxl->attr.style, + style_nseg * sizeof(QXLFIXED), group_id); + memcpy(red->attr.style, buf, style_nseg * sizeof(QXLFIXED)); + } else { + red->attr.style_nseg = 0; + red->attr.style = NULL; + } + red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush); + red->fore_mode = qxl->fore_mode; + red->back_mode = qxl->back_mode; } static void red_put_stroke(SpiceStroke *red) { red_put_brush(&red->brush); free(red->path); + if (red->attr.flags & SPICE_LINE_FLAGS_STYLED) { + free(red->attr.style); + } } static SpiceString *red_get_string(RedMemSlotInfo *slots, int group_id, diff --git a/server/red_worker.c b/server/red_worker.c index 8c36c133..e95d51a5 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -4093,33 +4093,10 @@ static void localize_mask(RedWorker *worker, SpiceQMask *mask, SpiceImage *image } } -static void localize_attr(RedWorker *worker, SpiceLineAttr *attr, uint32_t group_id) -{ - if (attr->style_nseg) { - uint8_t *buf; - uint8_t *data; - - ASSERT(attr->style); - buf = (uint8_t *)get_virt(&worker->mem_slots, attr->style, attr->style_nseg * sizeof(uint32_t), - group_id); - data = spice_malloc_n(attr->style_nseg, sizeof(uint32_t)); - memcpy(data, buf, attr->style_nseg * sizeof(uint32_t)); - attr->style = (QXLPHYSICAL)data; - } -} - -static void unlocalize_attr(SpiceLineAttr *attr) -{ - if (attr->style_nseg) { - free((void *)attr->style); - attr->style = 0; - } -} - static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable) { RedSurface *surface; - SpiceCanvas *canvas; + SpiceCanvas *canvas; SpiceClip clip = drawable->red_drawable->clip; surface = &worker->surfaces[drawable->surface_id]; @@ -4227,10 +4204,8 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable) SpiceStroke stroke = drawable->red_drawable->u.stroke; SpiceImage img1; localize_brush(worker, &stroke.brush, &img1); - localize_attr(worker, &stroke.attr, drawable->group_id); canvas->ops->draw_stroke(canvas, &drawable->red_drawable->bbox, &clip, &stroke); - unlocalize_attr(&stroke.attr); break; } case QXL_DRAW_TEXT: { @@ -6388,15 +6363,11 @@ static void fill_mask(DisplayChannel *display_channel, SpiceMarshaller *m, static void fill_attr(DisplayChannel *display_channel, SpiceMarshaller *m, SpiceLineAttr *attr, uint32_t group_id) { - RedChannel *channel = &display_channel->base; - uint32_t *style; int i; if (m && attr->style_nseg) { - style = (uint32_t *)get_virt(&channel->worker->mem_slots, attr->style, - attr->style_nseg * sizeof(uint32_t), group_id); for (i = 0 ; i < attr->style_nseg; i++) { - spice_marshaller_add_uint32(m, style[i]); + spice_marshaller_add_uint32(m, attr->style[i]); } } } diff --git a/spice.proto b/spice.proto index e16250f1..bd56eb2c 100644 --- a/spice.proto +++ b/spice.proto @@ -536,7 +536,7 @@ struct LineAttr { } u1 @anon; switch (flags) { case STYLED: - fixed28_4 *style[style_nseg]; + fixed28_4 *style[style_nseg] @c_ptr; } u2 @anon; }; diff --git a/spice1.proto b/spice1.proto index 7bbccb7f..23ce9f1c 100644 --- a/spice1.proto +++ b/spice1.proto @@ -493,7 +493,7 @@ struct LineAttr { uint8 style_nseg; fixed28_4 width @zero; fixed28_4 miter_limit @zero; - fixed28_4 *style[style_nseg]; + fixed28_4 *style[style_nseg] @c_ptr; }; struct RasterGlyphA1 { |