From af07170b42ef40ccd0c318641d6e7c54db8be8bf Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 27 Feb 2012 12:39:13 -0800 Subject: [PATCH] Use transfer, not copy. --- include/rdp_gdi.h | 3 ++- src/rdp_gdi.c | 46 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/include/rdp_gdi.h b/include/rdp_gdi.h index 0df7587..97cc305 100644 --- a/include/rdp_gdi.h +++ b/include/rdp_gdi.h @@ -41,7 +41,8 @@ #include #include -guac_composite_mode guac_rdp_rop3_composite_mode(guac_client* client, int rop3); +guac_composite_mode guac_rdp_rop3_transfer_function(guac_client* client, + int rop3); void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt); void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt); diff --git a/src/rdp_gdi.c b/src/rdp_gdi.c index 7e17099..0b1300e 100644 --- a/src/rdp_gdi.c +++ b/src/rdp_gdi.c @@ -42,32 +42,35 @@ #include "client.h" #include "rdp_bitmap.h" -guac_composite_mode guac_rdp_rop3_composite_mode(guac_client* client, +guac_transfer_function guac_rdp_rop3_transfer_function(guac_client* client, int rop3) { /* Translate supported ROP3 opcodes into composite modes */ switch (rop3) { /* "SRCINVERT" (src ^ dest) */ - case 0x66: return GUAC_COMP_BINARY_XOR; + case 0x66: return GUAC_TRANSFER_BINARY_SRC; /* "SRCAND" (src & dest) */ - case 0x88: return GUAC_COMP_BINARY_AND; + case 0x88: return GUAC_TRANSFER_BINARY_AND; /* "MERGEPAINT" !(src | dest)*/ - case 0xBB: return GUAC_COMP_BINARY_NOR; + case 0xBB: return GUAC_TRANSFER_BINARY_NOR; /* "SRCCOPY" (src) */ - case 0xCC: return GUAC_COMP_OVER; + case 0xCC: return GUAC_TRANSFER_BINARY_SRC; /* "SRCPAINT" (src | dest) */ - case 0xEE: return GUAC_COMP_BINARY_OR; + case 0xEE: return GUAC_TRANSFER_BINARY_OR; } /* Log warning if ROP3 opcode not supported */ - guac_client_log_info (client, "guac_rdp_rop3_composite_mode: UNSUPPORTED opcode = 0x%02X", rop3); - return GUAC_COMP_OVER; + guac_client_log_info (client, "guac_rdp_rop3_transfer_function: " + "UNSUPPORTED opcode = 0x%02X", rop3); + + /* Default to BINARY_SRC */ + return GUAC_TRANSFER_BINARY_SRC; } @@ -126,12 +129,27 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { guac_socket* socket = client->socket; guac_rdp_bitmap* bitmap = (guac_rdp_bitmap*) memblt->bitmap; - if (bitmap->layer != NULL) - guac_protocol_send_copy(socket, - bitmap->layer, - memblt->nXSrc, memblt->nYSrc, memblt->nWidth, memblt->nHeight, - guac_rdp_rop3_composite_mode(client, memblt->bRop), - current_layer, memblt->nLeftRect, memblt->nTopRect); + if (bitmap->layer != NULL) { + + /* If operation is just SRC, simply copy */ + if (memblt->bRop == 0xCC) + guac_protocol_send_copy(socket, + bitmap->layer, + memblt->nXSrc, memblt->nYSrc, + memblt->nWidth, memblt->nHeight, + GUAC_COMP_OVER, + current_layer, memblt->nLeftRect, memblt->nTopRect); + + /* Otherwise, use transfer */ + else + guac_protocol_send_transfer(socket, + bitmap->layer, + memblt->nXSrc, memblt->nYSrc, + memblt->nWidth, memblt->nHeight, + guac_rdp_rop3_transfer_function(client, memblt->bRop), + current_layer, memblt->nLeftRect, memblt->nTopRect); + + } } -- 1.7.10.4