Implement PAT ops.
This commit is contained in:
parent
cf71ae25a0
commit
e0f4ed892b
@ -158,6 +158,9 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
|
|||||||
/* Layer for actual transfer */
|
/* Layer for actual transfer */
|
||||||
guac_layer* buffer;
|
guac_layer* buffer;
|
||||||
|
|
||||||
|
/* Transfer function (if necessary) */
|
||||||
|
guac_transfer_function transfer;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Warn that rendering is a fallback, as the server should not be sending
|
* Warn that rendering is a fallback, as the server should not be sending
|
||||||
* this order.
|
* this order.
|
||||||
@ -185,17 +188,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
|
|||||||
|
|
||||||
/* If operation is just SRC, send background only */
|
/* If operation is just SRC, send background only */
|
||||||
case 0xCC:
|
case 0xCC:
|
||||||
guac_protocol_send_rect(client->socket, current_layer,
|
case 0xF0:
|
||||||
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:
|
|
||||||
guac_protocol_send_rect(client->socket, current_layer,
|
guac_protocol_send_rect(client->socket, current_layer,
|
||||||
patblt->nLeftRect, patblt->nTopRect,
|
patblt->nLeftRect, patblt->nTopRect,
|
||||||
patblt->nWidth, patblt->nHeight);
|
patblt->nWidth, patblt->nHeight);
|
||||||
@ -208,13 +201,40 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
|
|||||||
0xFF);
|
0xFF);
|
||||||
break;
|
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 */
|
/* Otherwise, use transfer */
|
||||||
default:
|
default:
|
||||||
|
|
||||||
/* Allocate buffer for transfer */
|
/* Allocate buffer for transfer */
|
||||||
buffer = guac_client_alloc_buffer(client);
|
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 */
|
/* Send rectangle stroke */
|
||||||
guac_protocol_send_rect(client->socket, buffer,
|
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,
|
buffer, 0, 0, patblt->nWidth, patblt->nHeight,
|
||||||
|
|
||||||
/* ... using specified transfer function */
|
/* ... using specified transfer function */
|
||||||
guac_rdp_rop3_transfer_function(
|
transfer,
|
||||||
client, patblt->bRop),
|
|
||||||
|
|
||||||
/* ... to current layer */
|
/* ... to current layer */
|
||||||
current_layer, patblt->nLeftRect, patblt->nTopRect);
|
current_layer, patblt->nLeftRect, patblt->nTopRect);
|
||||||
|
Loading…
Reference in New Issue
Block a user