summaryrefslogtreecommitdiffstats
path: root/server/red_parse_qxl.c
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-06-28 15:23:12 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-08-24 13:44:42 -0400
commita91daa2feb50a3d39150993a9d1b397b3c85ad03 (patch)
treede890ed96413ca8dc7ec5ab40256ddedffaf46fd /server/red_parse_qxl.c
parent22b64d2ae25dba938da65983cbf3d63e6336907f (diff)
downloadspice-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.c59
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;