From e0f4ed892b91f3ddeb905ff608c2dbb0f5e52baf Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 13 Dec 2012 14:56:45 -0800 Subject: [PATCH] Implement PAT ops. --- protocols/rdp/src/rdp_gdi.c | 47 ++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/protocols/rdp/src/rdp_gdi.c b/protocols/rdp/src/rdp_gdi.c index 575419f2..4d4a5b46 100644 --- a/protocols/rdp/src/rdp_gdi.c +++ b/protocols/rdp/src/rdp_gdi.c @@ -158,6 +158,9 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { /* Layer for actual transfer */ guac_layer* buffer; + /* Transfer function (if necessary) */ + guac_transfer_function transfer; + /* * Warn that rendering is a fallback, as the server should not be sending * this order. @@ -185,17 +188,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { /* If operation is just SRC, send background only */ case 0xCC: - guac_protocol_send_rect(client->socket, current_layer, - patblt->nLeftRect, patblt->nTopRect, - patblt->nWidth, patblt->nHeight); - - guac_protocol_send_cfill(client->socket, - GUAC_COMP_OVER, current_layer, - 0x00, 0x00, 0x00, 0xFF); - break; - - /* If whiteness, send white rectangle */ - case 0xFF: + case 0xF0: guac_protocol_send_rect(client->socket, current_layer, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight); @@ -208,13 +201,40 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { 0xFF); break; + /* If whiteness, send white rectangle */ + case 0xFF: + guac_protocol_send_rect(client->socket, current_layer, + patblt->nLeftRect, patblt->nTopRect, + patblt->nWidth, patblt->nHeight); + + guac_protocol_send_cfill(client->socket, + GUAC_COMP_OVER, current_layer, + 0xFF, 0xFF, 0xFF, 0xFF); + break; + /* Otherwise, use transfer */ default: /* Allocate buffer for transfer */ buffer = guac_client_alloc_buffer(client); - /* Get transfer function for ROP */ + /* Get reasonable transfer function for ROP */ + switch (patblt->bRop) { + + /* PATINVERT */ + case 0x5A: + transfer = GUAC_TRANSFER_BINARY_XOR; + break; + + /* PATPAINT */ + case 0xFB: + transfer = GUAC_TRANSFER_BINARY_OR; + break; + + default: + transfer = guac_rdp_rop3_transfer_function( + client, patblt->bRop); + } /* Send rectangle stroke */ guac_protocol_send_rect(client->socket, buffer, @@ -234,8 +254,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { buffer, 0, 0, patblt->nWidth, patblt->nHeight, /* ... using specified transfer function */ - guac_rdp_rop3_transfer_function( - client, patblt->bRop), + transfer, /* ... to current layer */ current_layer, patblt->nLeftRect, patblt->nTopRect);