Do not modify input, initialize bounded flag.

This commit is contained in:
Michael Jumper 2013-05-13 14:34:24 -07:00
parent 960c3e1e4a
commit 00e44007f5
2 changed files with 56 additions and 33 deletions

View File

@ -494,6 +494,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
/* Store client data */ /* Store client data */
guac_client_data->rdp_inst = rdp_inst; guac_client_data->rdp_inst = rdp_inst;
guac_client_data->bounded = false;
guac_client_data->mouse_button_mask = 0; guac_client_data->mouse_button_mask = 0;
guac_client_data->current_surface = GUAC_DEFAULT_LAYER; guac_client_data->current_surface = GUAC_DEFAULT_LAYER;
guac_client_data->clipboard = NULL; guac_client_data->clipboard = NULL;

View File

@ -143,11 +143,16 @@ void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) {
guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client* client = ((rdp_freerdp_context*) context)->client;
const guac_layer* current_layer = ((rdp_guac_client_data*) client->data)->current_surface; const guac_layer* current_layer = ((rdp_guac_client_data*) client->data)->current_surface;
int x = dstblt->nLeftRect;
int y = dstblt->nTopRect;
int w = dstblt->nWidth;
int h = dstblt->nHeight;
rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data;
pthread_mutex_lock(&(data->update_lock)); pthread_mutex_lock(&(data->update_lock));
/* Clip operation to bounds */ /* Clip operation to bounds */
__guac_rdp_clip_rect(data, &(dstblt->nLeftRect), &(dstblt->nTopRect), &(dstblt->nWidth), &(dstblt->nHeight)); __guac_rdp_clip_rect(data, &x, &y, &w, &h);
switch (dstblt->bRop) { switch (dstblt->bRop) {
@ -156,8 +161,8 @@ void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) {
/* Send black rectangle */ /* Send black rectangle */
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
dstblt->nLeftRect, dstblt->nTopRect, x, y,
dstblt->nWidth, dstblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -194,6 +199,11 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
const guac_layer* current_layer = const guac_layer* current_layer =
((rdp_guac_client_data*) client->data)->current_surface; ((rdp_guac_client_data*) client->data)->current_surface;
int x = patblt->nLeftRect;
int y = patblt->nTopRect;
int w = patblt->nWidth;
int h = patblt->nHeight;
rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data;
/* Layer for actual transfer */ /* Layer for actual transfer */
@ -207,7 +217,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
"negotiated client capabilities)"); "negotiated client capabilities)");
/* Clip operation to bounds */ /* Clip operation to bounds */
__guac_rdp_clip_rect(data, &(patblt->nLeftRect), &(patblt->nTopRect), &(patblt->nWidth), &(patblt->nHeight)); __guac_rdp_clip_rect(data, &x, &y, &w, &h);
/* Render rectangle based on ROP */ /* Render rectangle based on ROP */
switch (patblt->bRop) { switch (patblt->bRop) {
@ -215,8 +225,8 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
/* If blackness, send black rectangle */ /* If blackness, send black rectangle */
case 0x00: case 0x00:
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
patblt->nLeftRect, patblt->nTopRect, x, y,
patblt->nWidth, patblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -231,8 +241,8 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
case 0xCC: case 0xCC:
case 0xF0: case 0xF0:
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
patblt->nLeftRect, patblt->nTopRect, x, y,
patblt->nWidth, patblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -245,8 +255,8 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
/* If whiteness, send white rectangle */ /* If whiteness, send white rectangle */
case 0xFF: case 0xFF:
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
patblt->nLeftRect, patblt->nTopRect, x, y,
patblt->nWidth, patblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -261,7 +271,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
/* Send rectangle stroke */ /* Send rectangle stroke */
guac_protocol_send_rect(client->socket, buffer, guac_protocol_send_rect(client->socket, buffer,
0, 0, patblt->nWidth, patblt->nHeight); 0, 0, w, h);
/* Fill rectangle with fore color only */ /* Fill rectangle with fore color only */
guac_protocol_send_cfill(client->socket, GUAC_COMP_OVER, buffer, guac_protocol_send_cfill(client->socket, GUAC_COMP_OVER, buffer,
@ -271,13 +281,13 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
guac_protocol_send_transfer(client->socket, guac_protocol_send_transfer(client->socket,
/* ... from buffer */ /* ... from buffer */
buffer, 0, 0, patblt->nWidth, patblt->nHeight, buffer, 0, 0, w, h,
/* ... inverting */ /* ... inverting */
GUAC_TRANSFER_BINARY_XOR, GUAC_TRANSFER_BINARY_XOR,
/* ... to current layer */ /* ... to current layer */
current_layer, patblt->nLeftRect, patblt->nTopRect); current_layer, x, y);
/* Done with buffer */ /* Done with buffer */
guac_client_free_buffer(client, buffer); guac_client_free_buffer(client, buffer);
@ -291,18 +301,23 @@ void guac_rdp_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) {
guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client* client = ((rdp_freerdp_context*) context)->client;
const guac_layer* current_layer = ((rdp_guac_client_data*) client->data)->current_surface; const guac_layer* current_layer = ((rdp_guac_client_data*) client->data)->current_surface;
int x = scrblt->nLeftRect;
int y = scrblt->nTopRect;
int w = scrblt->nWidth;
int h = scrblt->nHeight;
rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data;
pthread_mutex_lock(&(data->update_lock)); pthread_mutex_lock(&(data->update_lock));
/* Clip operation to bounds */ /* Clip operation to bounds */
__guac_rdp_clip_rect(data, &(scrblt->nLeftRect), &(scrblt->nTopRect), &(scrblt->nWidth), &(scrblt->nHeight)); __guac_rdp_clip_rect(data, &x, &y, &w, &h);
/* Copy screen rect to current surface */ /* Copy screen rect to current surface */
guac_protocol_send_copy(client->socket, guac_protocol_send_copy(client->socket,
GUAC_DEFAULT_LAYER, GUAC_DEFAULT_LAYER,
scrblt->nXSrc, scrblt->nYSrc, scrblt->nWidth, scrblt->nHeight, scrblt->nXSrc, scrblt->nYSrc, w, h,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
scrblt->nLeftRect, scrblt->nTopRect); x, y);
pthread_mutex_unlock(&(data->update_lock)); pthread_mutex_unlock(&(data->update_lock));
@ -315,19 +330,24 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
guac_socket* socket = client->socket; guac_socket* socket = client->socket;
guac_rdp_bitmap* bitmap = (guac_rdp_bitmap*) memblt->bitmap; guac_rdp_bitmap* bitmap = (guac_rdp_bitmap*) memblt->bitmap;
int x = memblt->nLeftRect;
int y = memblt->nTopRect;
int w = memblt->nWidth;
int h = memblt->nHeight;
rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data;
pthread_mutex_lock(&(data->update_lock)); pthread_mutex_lock(&(data->update_lock));
/* Clip operation to bounds */ /* Clip operation to bounds */
__guac_rdp_clip_rect(data, &(memblt->nLeftRect), &(memblt->nTopRect), &(memblt->nWidth), &(memblt->nHeight)); __guac_rdp_clip_rect(data, &x, &y, &w, &h);
switch (memblt->bRop) { switch (memblt->bRop) {
/* If blackness, send black rectangle */ /* If blackness, send black rectangle */
case 0x00: case 0x00:
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
memblt->nLeftRect, memblt->nTopRect, x, y,
memblt->nWidth, memblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -354,13 +374,13 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
cairo_surface_t* surface = cairo_image_surface_create_for_data( cairo_surface_t* surface = cairo_image_surface_create_for_data(
memblt->bitmap->data + 4*(memblt->nXSrc + memblt->nYSrc*memblt->bitmap->width), memblt->bitmap->data + 4*(memblt->nXSrc + memblt->nYSrc*memblt->bitmap->width),
CAIRO_FORMAT_RGB24, CAIRO_FORMAT_RGB24,
memblt->nWidth, memblt->nHeight, w, h,
4*memblt->bitmap->width); 4*memblt->bitmap->width);
/* Send surface to buffer */ /* Send surface to buffer */
guac_protocol_send_png(socket, guac_protocol_send_png(socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
memblt->nLeftRect, memblt->nTopRect, surface); x, y, surface);
/* Free surface */ /* Free surface */
cairo_surface_destroy(surface); cairo_surface_destroy(surface);
@ -373,9 +393,9 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
guac_protocol_send_copy(socket, guac_protocol_send_copy(socket,
bitmap->layer, bitmap->layer,
memblt->nXSrc, memblt->nYSrc, memblt->nXSrc, memblt->nYSrc,
memblt->nWidth, memblt->nHeight, w, h,
GUAC_COMP_OVER, GUAC_COMP_OVER,
current_layer, memblt->nLeftRect, memblt->nTopRect); current_layer, x, y);
/* Increment usage counter */ /* Increment usage counter */
((guac_rdp_bitmap*) bitmap)->used++; ((guac_rdp_bitmap*) bitmap)->used++;
@ -385,8 +405,8 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
/* If whiteness, send white rectangle */ /* If whiteness, send white rectangle */
case 0xFF: case 0xFF:
guac_protocol_send_rect(client->socket, current_layer, guac_protocol_send_rect(client->socket, current_layer,
memblt->nLeftRect, memblt->nTopRect, x, y,
memblt->nWidth, memblt->nHeight); w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,
@ -403,9 +423,9 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
guac_protocol_send_transfer(socket, guac_protocol_send_transfer(socket,
bitmap->layer, bitmap->layer,
memblt->nXSrc, memblt->nYSrc, memblt->nXSrc, memblt->nYSrc,
memblt->nWidth, memblt->nHeight, w, h,
guac_rdp_rop3_transfer_function(client, memblt->bRop), guac_rdp_rop3_transfer_function(client, memblt->bRop),
current_layer, memblt->nLeftRect, memblt->nTopRect); current_layer, x, y);
/* Increment usage counter */ /* Increment usage counter */
((guac_rdp_bitmap*) bitmap)->used++; ((guac_rdp_bitmap*) bitmap)->used++;
@ -428,13 +448,15 @@ void guac_rdp_gdi_opaquerect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect
rdp_guac_client_data* data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* data = (rdp_guac_client_data*) client->data;
pthread_mutex_lock(&(data->update_lock)); pthread_mutex_lock(&(data->update_lock));
/* Clip operation to bounds */ int x = opaque_rect->nLeftRect;
__guac_rdp_clip_rect(data, &(opaque_rect->nLeftRect), &(opaque_rect->nTopRect), int y = opaque_rect->nTopRect;
&(opaque_rect->nWidth), &(opaque_rect->nHeight)); int w = opaque_rect->nWidth;
int h = opaque_rect->nHeight;
guac_protocol_send_rect(client->socket, current_layer, /* Clip operation to bounds */
opaque_rect->nLeftRect, opaque_rect->nTopRect, __guac_rdp_clip_rect(data, &x, &y, &w, &h);
opaque_rect->nWidth, opaque_rect->nHeight);
guac_protocol_send_rect(client->socket, current_layer, x, y, w, h);
guac_protocol_send_cfill(client->socket, guac_protocol_send_cfill(client->socket,
GUAC_COMP_OVER, current_layer, GUAC_COMP_OVER, current_layer,