Exemplo n.º 1
0
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(&region);
	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, &region))
				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(&region, &region, &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(&region, &region, &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, &region);
fail:
	region16_uninit(&region);
	xf_unlock_x11(xfc, FALSE);
	return ret;
}
Exemplo n.º 2
0
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;
}