static BOOL xf_gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND* cmd) { BYTE* pSrcData; xfContext* xfc = (xfContext*) context; BOOL ret = FALSE; DWORD format; rdpGdi* gdi; REGION16 region; RECTANGLE_16 cmdRect; if (!context || !cmd || !context->gdi) return FALSE; region16_init(®ion); cmdRect.left = cmd->destLeft; cmdRect.top = cmd->destTop; cmdRect.right = cmdRect.left + cmd->width; cmdRect.bottom = cmdRect.top + cmd->height; gdi = context->gdi; xf_lock_x11(xfc, FALSE); switch (cmd->codecID) { case RDP_CODEC_ID_REMOTEFX: if (!rfx_process_message(context->codecs->rfx, cmd->bitmapData, cmd->bitmapDataLength, cmd->destLeft, cmd->destTop, gdi->primary_buffer, gdi->dstFormat, gdi->stride, gdi->height, ®ion)) goto fail; break; case RDP_CODEC_ID_NSCODEC: if (!nsc_process_message(context->codecs->nsc, cmd->bpp, cmd->width, cmd->height, cmd->bitmapData, cmd->bitmapDataLength, gdi->primary_buffer, gdi->dstFormat, gdi->stride, 0, 0, cmd->width, cmd->height, FREERDP_FLIP_VERTICAL)) goto fail; region16_union_rect(®ion, ®ion, &cmdRect); break; case RDP_CODEC_ID_NONE: pSrcData = cmd->bitmapData; format = gdi_get_pixel_format(cmd->bpp); if (!freerdp_image_copy(gdi->primary_buffer, gdi->dstFormat, gdi->stride, 0, 0, cmd->width, cmd->height, pSrcData, format, 0, 0, 0, &xfc->context.gdi->palette, FREERDP_FLIP_VERTICAL)) goto fail; region16_union_rect(®ion, ®ion, &cmdRect); break; default: WLog_ERR(TAG, "Unsupported codecID %"PRIu32"", cmd->codecID); ret = TRUE; goto fail; } ret = xf_gdi_update_screen(xfc, gdi->primary_buffer, gdi->stride, ®ion); fail: region16_uninit(®ion); xf_unlock_x11(xfc, FALSE); return ret; }
static BOOL xf_gdi_surface_bits(rdpContext* context, const SURFACE_BITS_COMMAND* cmd) { BYTE* pSrcData; xfContext* xfc = (xfContext*) context; BOOL ret = FALSE; DWORD format; DWORD stride; rdpGdi* gdi; if (!context || !cmd || !context->gdi) return FALSE; gdi = context->gdi; stride = cmd->width * GetBytesPerPixel(gdi->dstFormat); xf_lock_x11(xfc, FALSE); switch (cmd->codecID) { case RDP_CODEC_ID_REMOTEFX: format = PIXEL_FORMAT_BGRX32; if (!rfx_process_message(context->codecs->rfx, cmd->bitmapData, format, cmd->bitmapDataLength, 0, 0, gdi->primary_buffer, gdi->dstFormat, stride, gdi->height, NULL)) goto fail; break; case RDP_CODEC_ID_NSCODEC: format = FREERDP_VFLIP_PIXEL_FORMAT(gdi->dstFormat); if (!nsc_process_message(context->codecs->nsc, cmd->bpp, cmd->width, cmd->height, cmd->bitmapData, cmd->bitmapDataLength, gdi->primary_buffer, format, stride, 0, 0, cmd->width, cmd->height)) goto fail; break; case RDP_CODEC_ID_NONE: pSrcData = cmd->bitmapData; format = PIXEL_FORMAT_BGRX32_VF; if (!freerdp_image_copy(gdi->primary_buffer, gdi->dstFormat, stride, 0, 0, cmd->width, cmd->height, pSrcData, format, 0, 0, 0, &xfc->context.gdi->palette)) goto fail; break; default: WLog_ERR(TAG, "Unsupported codecID %d", cmd->codecID); ret = TRUE; goto fail; } ret = xf_gdi_update_screen(xfc, cmd, gdi->primary_buffer); fail: xf_unlock_x11(xfc, FALSE); return ret; }