Use transfer, not copy.
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Mon, 27 Feb 2012 20:39:13 +0000 (12:39 -0800)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Mon, 27 Feb 2012 20:39:13 +0000 (12:39 -0800)
include/rdp_gdi.h
src/rdp_gdi.c

index 0df7587..97cc305 100644 (file)
@@ -41,7 +41,8 @@
 #include <guacamole/protocol.h>
 #include <freerdp/freerdp.h>
 
 #include <guacamole/protocol.h>
 #include <freerdp/freerdp.h>
 
-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);
 
 void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt);
 void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt);
index 7e17099..0b1300e 100644 (file)
 #include "client.h"
 #include "rdp_bitmap.h"
 
 #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) */
         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) */
 
         /* "SRCAND" (src & dest) */
-        case 0x88: return GUAC_COMP_BINARY_AND;
+        case 0x88: return GUAC_TRANSFER_BINARY_AND;
 
         /* "MERGEPAINT" !(src | dest)*/
 
         /* "MERGEPAINT" !(src | dest)*/
-        case 0xBB: return GUAC_COMP_BINARY_NOR;
+        case 0xBB: return GUAC_TRANSFER_BINARY_NOR;
 
         /* "SRCCOPY" (src) */
 
         /* "SRCCOPY" (src) */
-        case 0xCC: return GUAC_COMP_OVER;
+        case 0xCC: return GUAC_TRANSFER_BINARY_SRC;
 
         /* "SRCPAINT" (src | dest) */
 
         /* "SRCPAINT" (src | dest) */
-        case 0xEE: return GUAC_COMP_BINARY_OR;
+        case 0xEE: return GUAC_TRANSFER_BINARY_OR;
 
     }
 
     /* Log warning if ROP3 opcode not supported */
 
     }
 
     /* 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;
 
     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);
+
+    }
 
 }
 
 
 }