Ejemplo n.º 1
0
void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update)
{
    int i;
    rdpBitmap* bitmap;
    BITMAP_DATA* bitmap_data;
    tbool reused = true;
    rdpCache* cache = context->cache;

    if (cache->bitmap->bitmap == NULL)
    {
        cache->bitmap->bitmap = Bitmap_Alloc(context);
        cache->bitmap->bitmap->ephemeral = true;
        reused = false;
    }

    bitmap = cache->bitmap->bitmap;

    for (i = 0; i < (int) bitmap_update->number; i++)
    {
        bitmap_data = &bitmap_update->rectangles[i];

        bitmap->bpp = bitmap_data->bitsPerPixel;
        bitmap->length = bitmap_data->bitmapLength;
        bitmap->compressed = bitmap_data->compressed;

        Bitmap_SetRectangle(context, bitmap,
                            bitmap_data->destLeft, bitmap_data->destTop,
                            bitmap_data->destRight, bitmap_data->destBottom);

        Bitmap_SetDimensions(context, bitmap, bitmap_data->width, bitmap_data->height);

        bitmap->Decompress(context, bitmap,
                           bitmap_data->bitmapDataStream, bitmap_data->width, bitmap_data->height,
                           bitmap_data->bitsPerPixel, bitmap_data->bitmapLength,
                           bitmap_data->compressed, CODEC_ID_NONE);

        if (reused)
            bitmap->Free(context, bitmap);
        else
            reused = true;

        bitmap->New(context, bitmap);

        bitmap->Paint(context, bitmap);
    }
}
Ejemplo n.º 2
0
BOOL gdi_bitmap_update(rdpContext* context,
                       const BITMAP_UPDATE* bitmapUpdate)
{
	UINT32 index;

	if (!context || !bitmapUpdate || !context->gdi || !context->codecs)
		return FALSE;

	for (index = 0; index < bitmapUpdate->number; index++)
	{
		const BITMAP_DATA* bitmap = &(bitmapUpdate->rectangles[index]);
		rdpBitmap* bmp = Bitmap_Alloc(context);

		if (!bmp)
			return FALSE;

		Bitmap_SetDimensions(bmp, bitmap->width, bitmap->height);
		Bitmap_SetRectangle(bmp, bitmap->destLeft, bitmap->destTop, bitmap->destRight,
		                    bitmap->destBottom);

		if (!bmp->Decompress(context, bmp, bitmap->bitmapDataStream,
		                     bitmap->width, bitmap->height, bitmap->bitsPerPixel,
		                     bitmap->bitmapLength, bitmap->compressed,
		                     RDP_CODEC_ID_NONE))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		if (!bmp->New(context, bmp))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		if (!bmp->Paint(context, bmp))
		{
			Bitmap_Free(context, bmp);
			return FALSE;
		}

		Bitmap_Free(context, bmp);
	}

	return TRUE;
}