xfreerdp: fix bitmap updates after refactoring

This commit is contained in:
Marc-André Moreau 2011-10-20 21:34:55 -04:00
parent dbdbea9285
commit 657fd998e5
9 changed files with 79 additions and 38 deletions

View File

@ -170,7 +170,7 @@ void wf_gdi_bitmap_update(rdpUpdate* update, BITMAP_UPDATE* bitmap)
for (i = 0; i < bitmap->number; i++)
{
bmp = &bitmap->bitmaps[i];
bmp = &bitmap->rectangles[i];
wf_bmp = wf_image_new(wfi, bmp->width, bmp->height, wfi->srcBpp, bmp->dstData);

View File

@ -37,6 +37,7 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
XImage* image;
xfInfo* xfi = ((xfContext*) context)->xfi;
XSetFunction(xfi->display, xfi->gc, GXcopy);
pixmap = XCreatePixmap(xfi->display, xfi->drawable, bitmap->width, bitmap->height, xfi->depth);
if (bitmap->data != NULL)
@ -44,17 +45,24 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
data = freerdp_image_convert(bitmap->data, NULL,
bitmap->width, bitmap->height, bitmap->bpp, xfi->bpp, xfi->clrconv);
image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
if (bitmap->ephemeral != True)
{
image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
ZPixmap, 0, (char*) data, bitmap->width, bitmap->height, xfi->scanline_pad, 0);
XPutImage(xfi->display, pixmap, xfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height);
XPutImage(xfi->display, pixmap, xfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height);
XFree(image);
if (data != bitmap->data)
xfree(data);
if (data != bitmap->data)
xfree(data);
}
else
{
bitmap->data = data;
}
}
((xfBitmap*) bitmap)->pixmap = pixmap;
((xfBitmap*) bitmap)->image = image;
}
void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
@ -65,17 +73,32 @@ void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
XFreePixmap(xfi->display, ((xfBitmap*) bitmap)->pixmap);
}
void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap, int x, int y)
void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap)
{
XImage* image;
int width, height;
xfInfo* xfi = ((xfContext*) context)->xfi;
width = bitmap->right - bitmap->left + 1;
height = bitmap->bottom - bitmap->top + 1;
XSetFunction(xfi->display, xfi->gc, GXcopy);
image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
ZPixmap, 0, (char*) bitmap->data, bitmap->width, bitmap->height, xfi->scanline_pad, 0);
XPutImage(xfi->display, xfi->primary, xfi->gc,
((xfBitmap*) bitmap)->image, 0, 0, x, y, bitmap->width, bitmap->height);
image, 0, 0, bitmap->left, bitmap->top, width, height);
XFree(image);
if (xfi->remote_app != True)
XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, x, y, bitmap->width, bitmap->height, x, y);
{
XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc,
bitmap->left, bitmap->top, width, height, bitmap->left, bitmap->top);
}
gdi_InvalidateRegion(xfi->hdc, x, y, bitmap->width, bitmap->height);
gdi_InvalidateRegion(xfi->hdc, bitmap->left, bitmap->top, width, height);
}
void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
@ -94,8 +117,7 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
{
boolean status;
status = bitmap_decompress(data, bitmap->data,
width, height, length, bpp, bpp);
status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp);
if (status != True)
{
@ -104,11 +126,9 @@ void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
}
else
{
freerdp_image_flip(data, data, width, height, bpp);
freerdp_image_flip(data, bitmap->data, width, height, bpp);
}
bitmap->width = width;
bitmap->height = height;
bitmap->compressed = False;
bitmap->length = size;
bitmap->bpp = bpp;

View File

@ -55,7 +55,6 @@ struct xf_bitmap
{
rdpBitmap bitmap;
Pixmap pixmap;
XImage* image;
};
typedef struct xf_bitmap xfBitmap;

View File

@ -32,7 +32,7 @@ typedef struct rdp_pointer rdpPointer;
typedef void (*pBitmap_New)(rdpContext* context, rdpBitmap* bitmap);
typedef void (*pBitmap_Free)(rdpContext* context, rdpBitmap* bitmap);
typedef void (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap, int x, int y);
typedef void (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap);
typedef void (*pBitmap_Decompress)(rdpContext* context, rdpBitmap* bitmap,
uint8* data, int width, int height, int bpp, int length, boolean compressed);
typedef void (*pBitmap_SetSurface)(rdpContext* context, rdpBitmap* bitmap, boolean primary);
@ -51,6 +51,7 @@ struct rdp_bitmap
uint16 top;
uint16 right;
uint16 bottom;
uint16 width;
uint16 height;
uint16 bpp;
@ -59,6 +60,7 @@ struct rdp_bitmap
uint8* data;
boolean compressed;
boolean ephemeral;
};
FREERDP_API rdpBitmap* Bitmap_Alloc(rdpContext* context);
@ -67,6 +69,9 @@ FREERDP_API void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap);
FREERDP_API void Bitmap_Register(rdpContext* context, rdpBitmap* bitmap);
FREERDP_API void Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
uint8* data, int width, int height, int bpp, int length, boolean compressed);
FREERDP_API void Bitmap_SetRectangle(rdpContext* context, rdpBitmap* bitmap,
uint16 left, uint16 top, uint16 right, uint16 bottom);
FREERDP_API void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, uint16 width, uint16 height);
FREERDP_API void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary);
/* Pointer Class */

View File

@ -91,7 +91,7 @@ struct _BITMAP_UPDATE
{
uint16 count;
uint16 number;
BITMAP_DATA* bitmaps;
BITMAP_DATA* rectangles;
};
typedef struct _BITMAP_UPDATE BITMAP_UPDATE;

View File

@ -59,6 +59,8 @@ void update_gdi_cache_bitmap(rdpUpdate* update, CACHE_BITMAP_V2_ORDER* cache_bit
bitmap = Bitmap_Alloc(update->context);
Bitmap_SetDimensions(update->context, bitmap, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight);
bitmap->Decompress(update->context, bitmap,
cache_bitmap->bitmapDataStream, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight,
cache_bitmap->bitmapBpp, cache_bitmap->bitmapLength, cache_bitmap->compressed);
@ -81,13 +83,25 @@ void update_gdi_bitmap_update(rdpUpdate* update, BITMAP_UPDATE* bitmap_update)
rdpCache* cache = update->context->cache;
if (cache->bitmap->bitmap == NULL)
{
cache->bitmap->bitmap = Bitmap_Alloc(update->context);
cache->bitmap->bitmap->ephemeral = True;
}
bitmap = cache->bitmap->bitmap;
for (i = 0; i < bitmap_update->number; i++)
{
bitmap_data = &bitmap_update->bitmaps[i];
bitmap_data = &bitmap_update->rectangles[i];
bitmap->bpp = bitmap_data->bitsPerPixel;
bitmap->length = bitmap_data->bitmapLength;
Bitmap_SetRectangle(update->context, bitmap,
bitmap_data->destLeft, bitmap_data->destTop,
bitmap_data->destRight, bitmap_data->destBottom);
Bitmap_SetDimensions(update->context, bitmap, bitmap_data->width, bitmap_data->height);
bitmap->Decompress(update->context, bitmap,
bitmap_data->bitmapDataStream, bitmap_data->width, bitmap_data->height,
@ -95,7 +109,7 @@ void update_gdi_bitmap_update(rdpUpdate* update, BITMAP_UPDATE* bitmap_update)
bitmap->New(update->context, bitmap);
bitmap->Paint(update->context, bitmap, bitmap_data->destLeft, bitmap_data->destTop);
bitmap->Paint(update->context, bitmap);
}
}

View File

@ -34,6 +34,7 @@ rdpBitmap* Bitmap_Alloc(rdpContext* context)
if (bitmap != NULL)
{
memcpy(bitmap, context->graphics->Bitmap_Prototype, sizeof(rdpBitmap));
bitmap->data = NULL;
}
return bitmap;
@ -55,15 +56,18 @@ void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
}
}
void Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap, int x, int y)
void Bitmap_SetRectangle(rdpContext* context, rdpBitmap* bitmap, uint16 left, uint16 top, uint16 right, uint16 bottom)
{
bitmap->Paint(context, bitmap, x, y);
bitmap->left = left;
bitmap->top = top;
bitmap->right = right;
bitmap->bottom = bottom;
}
void Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
uint8* data, int width, int height, int bpp, int length, boolean compressed)
void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, uint16 width, uint16 height)
{
bitmap->Decompress(context, bitmap, data, width, height, bpp, length, compressed);
bitmap->width = width;
bitmap->height = height;
}
/* static method */

View File

@ -46,8 +46,6 @@ void update_recv_orders(rdpUpdate* update, STREAM* s)
void update_read_bitmap_data(STREAM* s, BITMAP_DATA* bitmap_data)
{
uint16 bytesPerPixel;
stream_read_uint16(s, bitmap_data->destLeft);
stream_read_uint16(s, bitmap_data->destTop);
stream_read_uint16(s, bitmap_data->destRight);
@ -58,8 +56,6 @@ void update_read_bitmap_data(STREAM* s, BITMAP_DATA* bitmap_data)
stream_read_uint16(s, bitmap_data->flags);
stream_read_uint16(s, bitmap_data->bitmapLength);
bytesPerPixel = (bitmap_data->bitsPerPixel + 7) / 8;
if (bitmap_data->flags & BITMAP_COMPRESSION)
{
uint16 cbCompMainBodySize;
@ -96,10 +92,10 @@ void update_read_bitmap(rdpUpdate* update, STREAM* s, BITMAP_UPDATE* bitmap_upda
count = bitmap_update->number * 2;
bitmap_update->bitmaps = (BITMAP_DATA*) xrealloc(bitmap_update->bitmaps,
bitmap_update->rectangles = (BITMAP_DATA*) xrealloc(bitmap_update->rectangles,
sizeof(BITMAP_DATA) * count);
memset(&bitmap_update->bitmaps[bitmap_update->count], 0,
memset(&bitmap_update->rectangles[bitmap_update->count], 0,
sizeof(BITMAP_DATA) * (count - bitmap_update->count));
bitmap_update->count = count;
@ -108,7 +104,7 @@ void update_read_bitmap(rdpUpdate* update, STREAM* s, BITMAP_UPDATE* bitmap_upda
/* rectangles */
for (i = 0; i < bitmap_update->number; i++)
{
update_read_bitmap_data(s, &bitmap_update->bitmaps[i]);
update_read_bitmap_data(s, &bitmap_update->rectangles[i]);
}
}
@ -406,7 +402,7 @@ rdpUpdate* update_new(rdpRdp* rdp)
if (update != NULL)
{
update->bitmap_update.count = 64;
update->bitmap_update.bitmaps = (BITMAP_DATA*) xzalloc(sizeof(BITMAP_DATA) * update->bitmap_update.count);
update->bitmap_update.rectangles = (BITMAP_DATA*) xzalloc(sizeof(BITMAP_DATA) * update->bitmap_update.count);
}
return update;
@ -416,7 +412,7 @@ void update_free(rdpUpdate* update)
{
if (update != NULL)
{
xfree(update->bitmap_update.bitmaps);
xfree(update->bitmap_update.rectangles);
xfree(update);
}
}

View File

@ -66,13 +66,16 @@ void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
}
}
void gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap, int x, int y)
void gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap)
{
int width, height;
gdiBitmap* gdi_bitmap = (gdiBitmap*) bitmap;
gdi_BitBlt(context->gdi->primary->hdc, x, y,
bitmap->width, bitmap->height,
gdi_bitmap->hdc, 0, 0, GDI_SRCCOPY);
width = bitmap->right - bitmap->left + 1;
height = bitmap->bottom - bitmap->top + 1;
gdi_BitBlt(context->gdi->primary->hdc, bitmap->left, bitmap->top,
width, height, gdi_bitmap->hdc, 0, 0, GDI_SRCCOPY);
}
void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,