Fixed paint_bitmap (was not using cx,cy, leading to black rectangles), proper bpp calculations, using SRC instead of OVER for create_bitmap operations.

This commit is contained in:
Michael Jumper 2011-07-26 13:40:00 -07:00
parent b32a2cce22
commit afcb7a63e3

View File

@ -120,7 +120,7 @@ RD_HBITMAP guac_rdp_ui_create_bitmap(rdpInst* inst, int width, int height, uint8
int x, y; int x, y;
int stride; int stride;
int bpp = inst->settings->server_depth / 8; int bpp = (inst->settings->server_depth + 7) / 8;
unsigned char* image_buffer; unsigned char* image_buffer;
unsigned char* image_buffer_row; unsigned char* image_buffer_row;
@ -174,7 +174,7 @@ RD_HBITMAP guac_rdp_ui_create_bitmap(rdpInst* inst, int width, int height, uint8
} }
surface = cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, stride); surface = cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, stride);
guac_send_png(io, GUAC_COMP_OVER, buffer, 0, 0, surface); guac_send_png(io, GUAC_COMP_SRC, buffer, 0, 0, surface);
guac_flush(io); guac_flush(io);
/* Free surface */ /* Free surface */
@ -194,41 +194,49 @@ void guac_rdp_ui_paint_bitmap(rdpInst* inst, int x, int y, int cx, int cy, int w
int dx, dy; int dx, dy;
int stride; int stride;
int bpp = inst->settings->server_depth / 8; int bpp = (inst->settings->server_depth + 7) / 8;
unsigned char* image_buffer; unsigned char* image_buffer;
unsigned char* image_buffer_row; unsigned char* image_buffer_row;
int data_stride = width * bpp;
unsigned char* data_row = data;
cairo_surface_t* surface; cairo_surface_t* surface;
/* Init Cairo buffer */ /* Init Cairo buffer */
stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, width); stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, cx);
image_buffer = malloc(height*stride); image_buffer = malloc(height*stride);
image_buffer_row = image_buffer; image_buffer_row = image_buffer;
/* Copy image data from image data to buffer */ /* Copy image data from image data to buffer */
for (dy = 0; dy<height; dy++) { for (dy = 0; dy<cy; dy++) {
unsigned int* image_buffer_current; unsigned int* image_buffer_current;
unsigned char* data_current = data_row;
/* Get current buffer row, advance to next */ /* Get current buffer row, advance to next */
image_buffer_current = (unsigned int*) image_buffer_row; image_buffer_current = (unsigned int*) image_buffer_row;
image_buffer_row += stride; image_buffer_row += stride;
for (dx = 0; dx<width; dx++) { /* Get current data row, advance to next */
data_current = data_row;
data_row += data_stride;
for (dx = 0; dx<cx; dx++) {
unsigned char red, green, blue; unsigned char red, green, blue;
unsigned int v; unsigned int v;
switch (bpp) { switch (bpp) {
case 3: case 3:
blue = *((unsigned char*) data++); blue = *((unsigned char*) data_current++);
green = *((unsigned char*) data++); green = *((unsigned char*) data_current++);
red = *((unsigned char*) data++); red = *((unsigned char*) data_current++);
break; break;
case 2: case 2:
v = *((unsigned char*) data++); v = *((unsigned char*) data_current++);
v |= *((unsigned char*) data++) << 8; v |= *((unsigned char*) data_current++) << 8;
red = ((v >> 8) & 0xF8) | ((v >> 13) & 0x07); red = ((v >> 8) & 0xF8) | ((v >> 13) & 0x07);
green = ((v >> 3) & 0xFC) | ((v >> 9) & 0x03); green = ((v >> 3) & 0xFC) | ((v >> 9) & 0x03);
@ -247,7 +255,7 @@ void guac_rdp_ui_paint_bitmap(rdpInst* inst, int x, int y, int cx, int cy, int w
} }
} }
surface = cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, width, height, stride); surface = cairo_image_surface_create_for_data(image_buffer, CAIRO_FORMAT_RGB24, cx, cy, stride);
guac_send_png(io, GUAC_COMP_OVER, current_surface, x, y, surface); guac_send_png(io, GUAC_COMP_OVER, current_surface, x, y, surface);
guac_flush(io); guac_flush(io);
@ -404,7 +412,7 @@ void guac_rdp_ui_memblt(rdpInst* inst, uint8 opcode, int x, int y, int width, in
guac_client* client = (guac_client*) inst->param1; guac_client* client = (guac_client*) inst->param1;
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data; rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
const guac_layer* current_surface = guac_client_data->current_surface; const guac_layer* current_surface = guac_client_data->current_surface;
GUACIO* io = client->io; GUACIO* io = client->io;
if (opcode != 204) if (opcode != 204)