Fix memblt/scrblt source coordinates.
This commit is contained in:
parent
b20aa53843
commit
8698cfc1cc
@ -160,9 +160,7 @@ void guac_rdp_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) {
|
|||||||
case 0:
|
case 0:
|
||||||
|
|
||||||
/* Send black rectangle */
|
/* Send black rectangle */
|
||||||
guac_protocol_send_rect(client->socket, current_layer,
|
guac_protocol_send_rect(client->socket, current_layer, x, y, w, h);
|
||||||
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,
|
||||||
@ -224,9 +222,7 @@ 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, x, y, w, h);
|
||||||
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,
|
||||||
@ -240,9 +236,7 @@ void guac_rdp_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) {
|
|||||||
/* If operation is just a copy, send foreground only */
|
/* If operation is just a copy, send foreground only */
|
||||||
case 0xCC:
|
case 0xCC:
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
guac_protocol_send_rect(client->socket, current_layer,
|
guac_protocol_send_rect(client->socket, current_layer, x, y, w, h);
|
||||||
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,
|
||||||
@ -254,9 +248,7 @@ 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, x, y, w, h);
|
||||||
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,
|
||||||
@ -306,18 +298,23 @@ void guac_rdp_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) {
|
|||||||
int w = scrblt->nWidth;
|
int w = scrblt->nWidth;
|
||||||
int h = scrblt->nHeight;
|
int h = scrblt->nHeight;
|
||||||
|
|
||||||
|
int x_src = scrblt->nXSrc;
|
||||||
|
int y_src = scrblt->nYSrc;
|
||||||
|
|
||||||
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, &x, &y, &w, &h);
|
__guac_rdp_clip_rect(data, &x, &y, &w, &h);
|
||||||
|
|
||||||
|
/* Update source coordinates */
|
||||||
|
x_src += x - scrblt->nLeftRect;
|
||||||
|
y_src += y - scrblt->nTopRect;
|
||||||
|
|
||||||
/* 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, x_src, y_src, w, h,
|
||||||
scrblt->nXSrc, scrblt->nYSrc, w, h,
|
GUAC_COMP_OVER, current_layer, x, y);
|
||||||
GUAC_COMP_OVER, current_layer,
|
|
||||||
x, y);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&(data->update_lock));
|
pthread_mutex_unlock(&(data->update_lock));
|
||||||
|
|
||||||
@ -335,19 +332,24 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
|
|||||||
int w = memblt->nWidth;
|
int w = memblt->nWidth;
|
||||||
int h = memblt->nHeight;
|
int h = memblt->nHeight;
|
||||||
|
|
||||||
|
int x_src = memblt->nXSrc;
|
||||||
|
int y_src = memblt->nYSrc;
|
||||||
|
|
||||||
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, &x, &y, &w, &h);
|
__guac_rdp_clip_rect(data, &x, &y, &w, &h);
|
||||||
|
|
||||||
|
/* Update source coordinates */
|
||||||
|
x_src += x - memblt->nLeftRect;
|
||||||
|
y_src += y - memblt->nTopRect;
|
||||||
|
|
||||||
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, x, y, w, h);
|
||||||
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,
|
||||||
@ -372,10 +374,8 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
|
|||||||
|
|
||||||
/* Create surface from image data */
|
/* Create surface from image data */
|
||||||
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*(x_src + y_src*memblt->bitmap->width),
|
||||||
CAIRO_FORMAT_RGB24,
|
CAIRO_FORMAT_RGB24, w, h, 4*memblt->bitmap->width);
|
||||||
w, h,
|
|
||||||
4*memblt->bitmap->width);
|
|
||||||
|
|
||||||
/* Send surface to buffer */
|
/* Send surface to buffer */
|
||||||
guac_protocol_send_png(socket,
|
guac_protocol_send_png(socket,
|
||||||
@ -391,11 +391,8 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
|
|||||||
/* Otherwise, copy */
|
/* Otherwise, copy */
|
||||||
else
|
else
|
||||||
guac_protocol_send_copy(socket,
|
guac_protocol_send_copy(socket,
|
||||||
bitmap->layer,
|
bitmap->layer, x_src, y_src, w, h,
|
||||||
memblt->nXSrc, memblt->nYSrc,
|
GUAC_COMP_OVER, current_layer, x, y);
|
||||||
w, h,
|
|
||||||
GUAC_COMP_OVER,
|
|
||||||
current_layer, x, y);
|
|
||||||
|
|
||||||
/* Increment usage counter */
|
/* Increment usage counter */
|
||||||
((guac_rdp_bitmap*) bitmap)->used++;
|
((guac_rdp_bitmap*) bitmap)->used++;
|
||||||
@ -404,9 +401,7 @@ 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, x, y, w, h);
|
||||||
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,
|
||||||
@ -421,9 +416,7 @@ void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) {
|
|||||||
guac_rdp_cache_bitmap(context, memblt->bitmap);
|
guac_rdp_cache_bitmap(context, memblt->bitmap);
|
||||||
|
|
||||||
guac_protocol_send_transfer(socket,
|
guac_protocol_send_transfer(socket,
|
||||||
bitmap->layer,
|
bitmap->layer, x_src, y_src, w, h,
|
||||||
memblt->nXSrc, memblt->nYSrc,
|
|
||||||
w, h,
|
|
||||||
guac_rdp_rop3_transfer_function(client, memblt->bRop),
|
guac_rdp_rop3_transfer_function(client, memblt->bRop),
|
||||||
current_layer, x, y);
|
current_layer, x, y);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user