void xf_gdi_surface_bits(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command) { int i, tx, ty; XImage* image; RFX_MESSAGE* message; xfInfo* xfi = GET_XFI(update); RFX_CONTEXT* context = (RFX_CONTEXT*) xfi->rfx_context; NSC_CONTEXT* ncontext = (NSC_CONTEXT*) xfi->nsc_context; if (surface_bits_command->codecID == CODEC_ID_REMOTEFX) { message = rfx_process_message(context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); XSetFunction(xfi->display, xfi->gc, GXcopy); XSetFillStyle(xfi->display, xfi->gc, FillSolid); XSetClipRectangles(xfi->display, xfi->gc, surface_bits_command->destLeft, surface_bits_command->destTop, (XRectangle*) message->rects, message->num_rects, YXBanded); /* Draw the tiles to primary surface, each is 64x64. */ for (i = 0; i < message->num_tiles; i++) { image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, (char*) message->tiles[i]->data, 64, 64, 32, 0); tx = message->tiles[i]->x + surface_bits_command->destLeft; ty = message->tiles[i]->y + surface_bits_command->destTop; XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, tx, ty, 64, 64); XFree(image); } /* Copy the updated region from backstore to the window. */ for (i = 0; i < message->num_rects; i++) { tx = message->rects[i].x + surface_bits_command->destLeft; ty = message->rects[i].y + surface_bits_command->destTop; if (xfi->remote_app != True) { XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, tx, ty, message->rects[i].width, message->rects[i].height, tx, ty); } gdi_InvalidateRegion(xfi->hdc, tx, ty, message->rects[i].width, message->rects[i].height); } XSetClipMask(xfi->display, xfi->gc, None); rfx_message_free(context, message); } else if (surface_bits_command->codecID == CODEC_ID_NSCODEC) { ncontext->width = surface_bits_command->width; ncontext->height = surface_bits_command->height; nsc_process_message(ncontext, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); XSetFunction(xfi->display, xfi->gc, GXcopy); XSetFillStyle(xfi->display, xfi->gc, FillSolid); xfi->bmp_codec_nsc = (uint8*) xrealloc(xfi->bmp_codec_nsc, surface_bits_command->width * surface_bits_command->height * 4); freerdp_image_flip(ncontext->bmpdata, xfi->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32); image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, (char*) xfi->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32, 0); XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); if (xfi->remote_app != True) { XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, surface_bits_command->destLeft, surface_bits_command->destTop); } gdi_InvalidateRegion(xfi->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); XSetClipMask(xfi->display, xfi->gc, None); nsc_context_destroy(ncontext); } else if (surface_bits_command->codecID == CODEC_ID_NONE) { XSetFunction(xfi->display, xfi->gc, GXcopy); XSetFillStyle(xfi->display, xfi->gc, FillSolid); xfi->bmp_codec_none = (uint8*) xrealloc(xfi->bmp_codec_none, surface_bits_command->width * surface_bits_command->height * 4); freerdp_image_flip(surface_bits_command->bitmapData, xfi->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32); image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0, (char*) xfi->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32, 0); XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); if (xfi->remote_app != True) { XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, surface_bits_command->destLeft, surface_bits_command->destTop); } gdi_InvalidateRegion(xfi->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height); XSetClipMask(xfi->display, xfi->gc, None); } else { printf("Unsupported codecID %d\n", surface_bits_command->codecID); } }
void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command) { int i, j; int tx, ty; char* tile_bitmap; RFX_MESSAGE* message; wfInfo* wfi = ((wfContext*) context)->wfi; RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) wfi->rfx_context; NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) wfi->nsc_context; tile_bitmap = (char*) xzalloc(32); if (surface_bits_command->codecID == CODEC_ID_REMOTEFX) { message = rfx_process_message(rfx_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); /* blit each tile */ for (i = 0; i < message->num_tiles; i++) { tx = message->tiles[i]->x + surface_bits_command->destLeft; ty = message->tiles[i]->y + surface_bits_command->destTop; freerdp_image_convert(message->tiles[i]->data, wfi->tile->pdata, 64, 64, 32, 32, wfi->clrconv); for (j = 0; j < message->num_rects; j++) { wf_set_clip_rgn(wfi, surface_bits_command->destLeft + message->rects[j].x, surface_bits_command->destTop + message->rects[j].y, message->rects[j].width, message->rects[j].height); BitBlt(wfi->primary->hdc, tx, ty, 64, 64, wfi->tile->hdc, 0, 0, SRCCOPY); } } wf_set_null_clip_rgn(wfi); /* invalidate regions */ for (i = 0; i < message->num_rects; i++) { tx = surface_bits_command->destLeft + message->rects[i].x; ty = surface_bits_command->destTop + message->rects[i].y; wf_invalidate_region(wfi, tx, ty, message->rects[i].width, message->rects[i].height); } rfx_message_free(rfx_context, message); } else if (surface_bits_command->codecID == CODEC_ID_NSCODEC) { nsc_context->width = surface_bits_command->width; nsc_context->height = surface_bits_command->height; nsc_process_message(nsc_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); wfi->image->_bitmap.width = surface_bits_command->width; wfi->image->_bitmap.height = surface_bits_command->height; wfi->image->_bitmap.bpp = surface_bits_command->bpp; wfi->image->_bitmap.data = (uint8*) xrealloc(wfi->image->_bitmap.data, wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4); freerdp_image_flip(nsc_context->bmpdata, wfi->image->_bitmap.data, wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32); BitBlt(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, wfi->image->hdc, 0, 0, GDI_SRCCOPY); nsc_context_destroy(nsc_context); } else if (surface_bits_command->codecID == CODEC_ID_NONE) { wfi->image->_bitmap.width = surface_bits_command->width; wfi->image->_bitmap.height = surface_bits_command->height; wfi->image->_bitmap.bpp = surface_bits_command->bpp; wfi->image->_bitmap.data = (uint8*) xrealloc(wfi->image->_bitmap.data, wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4); if ((surface_bits_command->bpp != 32) || (wfi->clrconv->alpha == true)) { uint8* temp_image; freerdp_image_convert(surface_bits_command->bitmapData, wfi->image->_bitmap.data, wfi->image->_bitmap.width, wfi->image->_bitmap.height, wfi->image->_bitmap.bpp, 32, wfi->clrconv); surface_bits_command->bpp = 32; surface_bits_command->bitmapData = wfi->image->_bitmap.data; temp_image = (uint8*) xmalloc(wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4); freerdp_image_flip(wfi->image->_bitmap.data, temp_image, wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32); xfree(wfi->image->_bitmap.data); wfi->image->_bitmap.data = temp_image; } else { freerdp_image_flip(surface_bits_command->bitmapData, wfi->image->_bitmap.data, wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32); } BitBlt(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, wfi->image->hdc, 0, 0, SRCCOPY); } else { printf("Unsupported codecID %d\n", surface_bits_command->codecID); } if (tile_bitmap != NULL) xfree(tile_bitmap); }