diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-22 11:48:33 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-29 12:30:19 +0200 |
commit | 856e2ba355a3c277f4dbbfe417f113cef35d7a87 (patch) | |
tree | ff257da3289c652bed807e2abc15d785579025ed | |
parent | 11034dda428865e442dd2c981851500ed96b9a0c (diff) | |
download | spice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.tar.gz spice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.tar.xz spice-856e2ba355a3c277f4dbbfe417f113cef35d7a87.zip |
qxl abi: parse QXLCompatDrawable.
-rw-r--r-- | server/red_parse_qxl.c | 53 | ||||
-rw-r--r-- | server/red_parse_qxl.h | 2 | ||||
-rw-r--r-- | server/red_worker.c | 9 |
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; } |