diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-28 15:23:12 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-08-24 13:44:42 -0400 |
commit | a91daa2feb50a3d39150993a9d1b397b3c85ad03 (patch) | |
tree | de890ed96413ca8dc7ec5ab40256ddedffaf46fd /server/red_parse_qxl.c | |
parent | 22b64d2ae25dba938da65983cbf3d63e6336907f (diff) | |
download | spice-a91daa2feb50a3d39150993a9d1b397b3c85ad03.tar.gz spice-a91daa2feb50a3d39150993a9d1b397b3c85ad03.tar.xz spice-a91daa2feb50a3d39150993a9d1b397b3c85ad03.zip |
Add support for QXLComposite to spice server
In red-parse-qxl.c add support for parsing QXLComposite into
SpiceComposite. In red-worker.c add support for marshalling
SpiceComposite onto the wire.
Diffstat (limited to 'server/red_parse_qxl.c')
-rw-r--r-- | server/red_parse_qxl.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index 2953e800..bf577092 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -626,10 +626,61 @@ static void red_put_alpha_blend(SpiceAlphaBlend *red) red_put_image(red->src_bitmap); } +static bool get_transform(RedMemSlotInfo *slots, + int group_id, + QXLPHYSICAL qxl_transform, + SpiceTransform *dst_transform) + +{ + const uint32_t *t = NULL; + int error; + + if (qxl_transform == 0) + return FALSE; + + t = (uint32_t *)get_virt(slots, qxl_transform, sizeof(*dst_transform), group_id, &error); + + if (!t || error) + return FALSE; + + memcpy(dst_transform, t, sizeof(*dst_transform)); + return TRUE; +} + +static void red_get_composite_ptr(RedMemSlotInfo *slots, int group_id, + SpiceComposite *red, QXLComposite *qxl, uint32_t flags) +{ + red->flags = qxl->flags; + + red->src_bitmap = red_get_image(slots, group_id, qxl->src, flags); + if (get_transform(slots, group_id, qxl->src_transform, &red->src_transform)) + red->flags |= SPICE_COMPOSITE_HAS_SRC_TRANSFORM; + + if (qxl->mask) { + red->mask_bitmap = red_get_image(slots, group_id, qxl->mask, flags); + red->flags |= SPICE_COMPOSITE_HAS_MASK; + if (get_transform(slots, group_id, qxl->mask_transform, &red->mask_transform)) + red->flags |= SPICE_COMPOSITE_HAS_MASK_TRANSFORM; + } else { + red->mask_bitmap = NULL; + } + red->src_origin.x = qxl->src_origin.x; + red->src_origin.y = qxl->src_origin.y; + red->mask_origin.x = qxl->mask_origin.x; + red->mask_origin.y = qxl->mask_origin.y; +} + +static void red_put_composite(SpiceComposite *red) +{ + red_put_image(red->src_bitmap); + if (red->mask_bitmap) + red_put_image(red->mask_bitmap); +} + static void red_get_rop3_ptr(RedMemSlotInfo *slots, int group_id, SpiceRop3 *red, QXLRop3 *qxl, uint32_t flags) { - red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags); + red->src_bitmap = red_get_image(slots, group_id, qxl->src_bitmap, flags); red_get_rect_ptr(&red->src_area, &qxl->src_area); red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush, flags); red->rop3 = qxl->rop3; @@ -900,6 +951,9 @@ static int red_get_native_drawable(RedMemSlotInfo *slots, int group_id, case QXL_DRAW_ROP3: red_get_rop3_ptr(slots, group_id, &red->u.rop3, &qxl->u.rop3, flags); break; + case QXL_DRAW_COMPOSITE: + red_get_composite_ptr(slots, group_id, &red->u.composite, &qxl->u.composite, flags); + break; case QXL_DRAW_STROKE: error = red_get_stroke_ptr(slots, group_id, &red->u.stroke, &qxl->u.stroke, flags); break; @@ -1052,6 +1106,9 @@ void red_put_drawable(RedDrawable *red) case QXL_DRAW_ROP3: red_put_rop3(&red->u.rop3); break; + case QXL_DRAW_COMPOSITE: + red_put_composite(&red->u.composite); + break; case QXL_DRAW_STROKE: red_put_stroke(&red->u.stroke); break; |