summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-06-22 11:48:33 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-06-29 12:30:19 +0200
commit856e2ba355a3c277f4dbbfe417f113cef35d7a87 (patch)
treeff257da3289c652bed807e2abc15d785579025ed /server
parent11034dda428865e442dd2c981851500ed96b9a0c (diff)
downloadspice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.tar.gz
spice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.tar.xz
spice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.zip
qxl abi: parse QXLCompatDrawable.
Diffstat (limited to 'server')
-rw-r--r--server/red_parse_qxl.c53
-rw-r--r--server/red_parse_qxl.h2
-rw-r--r--server/red_worker.c9
3 files changed, 62 insertions, 2 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c
index b22cb836..aafd75a1 100644
--- a/server/red_parse_qxl.c
+++ b/server/red_parse_qxl.c
@@ -82,6 +82,59 @@ void red_get_drawable(RedMemSlotInfo *slots, int group_id,
};
}
+void red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, SPICE_ADDRESS addr)
+{
+ QXLCompatDrawable *qxl;
+
+ qxl = (QXLCompatDrawable *)get_virt(slots, addr, sizeof(*qxl), group_id);
+ red->release_info = &qxl->release_info;
+
+ red->bbox = qxl->bbox;
+ red->clip = qxl->clip;
+ red->effect = qxl->effect;
+ red->mm_time = qxl->mm_time;
+
+ red->type = qxl->type;
+ switch (red->type) {
+ case QXL_DRAW_ALPHA_BLEND:
+ red->u.alpha_blend = qxl->u.alpha_blend;
+ break;
+ case QXL_DRAW_BLACKNESS:
+ red->u.blackness = qxl->u.blackness;
+ break;
+ case QXL_DRAW_BLEND:
+ red->u.blend = qxl->u.blend;
+ break;
+ case QXL_DRAW_COPY:
+ red->u.copy = qxl->u.copy;
+ break;
+ case QXL_DRAW_FILL:
+ red->u.fill = qxl->u.fill;
+ break;
+ case QXL_DRAW_INVERS:
+ red->u.invers = qxl->u.invers;
+ break;
+ case QXL_DRAW_NOP:
+ break;
+ case QXL_DRAW_ROP3:
+ red->u.rop3 = qxl->u.rop3;
+ break;
+ case QXL_DRAW_STROKE:
+ red->u.stroke = qxl->u.stroke;
+ break;
+ case QXL_DRAW_TEXT:
+ red->u.text = qxl->u.text;
+ break;
+ case QXL_DRAW_TRANSPARENT:
+ red->u.transparent = qxl->u.transparent;
+ break;
+ case QXL_DRAW_WHITENESS:
+ red->u.whiteness = qxl->u.whiteness;
+ break;
+ };
+}
+
void red_put_drawable(RedDrawable *red)
{
/* nothing yet */
diff --git a/server/red_parse_qxl.h b/server/red_parse_qxl.h
index d8955d2f..5737b550 100644
--- a/server/red_parse_qxl.h
+++ b/server/red_parse_qxl.h
@@ -55,6 +55,8 @@ typedef struct SPICE_ATTR_PACKED RedDrawable {
void red_get_drawable(RedMemSlotInfo *slots, int group_id,
RedDrawable *red, SPICE_ADDRESS addr);
+void red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
+ RedDrawable *red, SPICE_ADDRESS addr);
void red_put_drawable(RedDrawable *red);
#endif
diff --git a/server/red_worker.c b/server/red_worker.c
index 34d89baa..d3529721 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -5031,8 +5031,13 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size)
switch (ext_cmd.cmd.type) {
case QXL_CMD_DRAW: {
RedDrawable *drawable = spice_new0(RedDrawable, 1);
- red_get_drawable(&worker->mem_slots, ext_cmd.group_id,
- drawable, ext_cmd.cmd.data);
+ if (ext_cmd.flags & QXL_COMMAND_FLAG_COMPAT) {
+ red_get_compat_drawable(&worker->mem_slots, ext_cmd.group_id,
+ drawable, ext_cmd.cmd.data);
+ } else {
+ red_get_drawable(&worker->mem_slots, ext_cmd.group_id,
+ drawable, ext_cmd.cmd.data);
+ }
red_process_drawable(worker, drawable, ext_cmd.group_id);
break;
}