diff options
Diffstat (limited to 'plugins/rdp/rdp_graphics.c')
-rw-r--r-- | plugins/rdp/rdp_graphics.c | 316 |
1 files changed, 20 insertions, 296 deletions
diff --git a/plugins/rdp/rdp_graphics.c b/plugins/rdp/rdp_graphics.c index 68e64c12c..b97f30e1a 100644 --- a/plugins/rdp/rdp_graphics.c +++ b/plugins/rdp/rdp_graphics.c @@ -47,142 +47,14 @@ //#define RF_BITMAP //#define RF_GLYPH -/* Bitmap Class */ - -BOOL rf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - UINT8* data; - Pixmap pixmap; - XImage* image; - rfContext* rfi = (rfContext*)context; - - XSetFunction(rfi->display, rfi->gc, GXcopy); - pixmap = XCreatePixmap(rfi->display, rfi->drawable, bitmap->width, bitmap->height, rfi->depth); - - if (bitmap->data != NULL) { - data = freerdp_image_convert(bitmap->data, NULL, - bitmap->width, bitmap->height, rfi->srcBpp, rfi->bpp, rfi->clrconv); - - if (bitmap->ephemeral != TRUE) { - image = XCreateImage(rfi->display, rfi->visual, rfi->depth, - ZPixmap, 0, (char*)data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); - - XPutImage(rfi->display, pixmap, rfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height); - XFree(image); - - if (data != bitmap->data) && (data != NULL) - free(data); - }else { - if (data != bitmap->data) && (data != NULL) - free(bitmap->data); - - bitmap->data = data; - } - } - - ((rfBitmap*)bitmap)->pixmap = pixmap; -#endif - return TRUE; -} - -void rf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - rfContext* rfi = (rfContext*)context; - - printf("rf_Bitmap_Free\n"); - - if (((rfBitmap*)bitmap)->pixmap != 0) - XFreePixmap(rfi->display, ((rfBitmap*)bitmap)->pixmap); -#endif -} - -BOOL rf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - XImage* image; - int width, height; - rfContext* rfi = (rfContext*)context; - - printf("rf_Bitmap_Paint\n"); - - width = bitmap->right - bitmap->left + 1; - height = bitmap->bottom - bitmap->top + 1; - - XSetFunction(rfi->display, rfi->gc, GXcopy); - - image = XCreateImage(rfi->display, rfi->visual, rfi->depth, - ZPixmap, 0, (char*)bitmap->data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); - - XPutImage(rfi->display, rfi->primary, rfi->gc, - image, 0, 0, bitmap->left, bitmap->top, width, height); - - XFree(image); - - //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, - // bitmap->left, bitmap->top, width, height, bitmap->left, bitmap->top); - - //gdi_InvalidateRegion(rfi->hdc, bitmap->left, bitmap->top, width, height); -#endif - return FALSE; -} - -BOOL rf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, - const BYTE* data, UINT32 width, UINT32 height, UINT32 bpp, UINT32 length, BOOL compressed, UINT32 codec_id) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - UINT16 size; - - printf("rf_Bitmap_Decompress\n"); - - size = width * height * (bpp + 7) / 8; - - if (bitmap->data == NULL) - bitmap->data = (UINT8*)xmalloc(size); - else - bitmap->data = (UINT8*)xrealloc(bitmap->data, size); - - if (compressed) { - BOOL status; - - status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp); - - if (status != TRUE) { - printf("Bitmap Decompression Failed\n"); - } - }else { - freerdp_image_flip(data, bitmap->data, width, height, bpp); - } - - bitmap->compressed = FALSE; - bitmap->length = size; - bitmap->bpp = bpp; -#endif - return TRUE; -} - -BOOL rf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) -{ - TRACE_CALL(__func__); -#ifdef RF_BITMAP - rfContext* rfi = (rfContext*)context; - - if (primary) - rfi->drawing = rfi->primary; - else - rfi->drawing = ((rfBitmap*)bitmap)->pixmap; -#endif - return TRUE; -} - /* Pointer Class */ +#if FREERDP_VERSION_MAJOR < 3 +#define CONST_ARG const +#else +#define CONST_ARG +#endif -BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) +static BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -199,7 +71,7 @@ BOOL rf_Pointer_New(rdpContext* context, rdpPointer* pointer) return FALSE; } -void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) +static void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -216,7 +88,7 @@ void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) } } -BOOL rf_Pointer_Set(rdpContext* context, const rdpPointer* pointer) +static BOOL rf_Pointer_Set(rdpContext* context, CONST_ARG rdpPointer* pointer) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -231,7 +103,7 @@ BOOL rf_Pointer_Set(rdpContext* context, const rdpPointer* pointer) } -BOOL rf_Pointer_SetNull(rdpContext* context) +static BOOL rf_Pointer_SetNull(rdpContext* context) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -244,7 +116,7 @@ BOOL rf_Pointer_SetNull(rdpContext* context) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -BOOL rf_Pointer_SetDefault(rdpContext* context) +static BOOL rf_Pointer_SetDefault(rdpContext* context) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -257,7 +129,7 @@ BOOL rf_Pointer_SetDefault(rdpContext* context) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) +static BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) { TRACE_CALL(__func__); RemminaPluginRdpUiObject* ui; @@ -271,169 +143,21 @@ BOOL rf_Pointer_SetPosition(rdpContext* context, UINT32 x, UINT32 y) return remmina_rdp_event_queue_ui_sync_retint(rfi->protocol_widget, ui) ? TRUE : FALSE; } -/* Glyph Class */ - -BOOL rf_Glyph_New(rdpContext* context, const rdpGlyph* glyph) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - int scanline; - XImage* image; - rfContext* rfi; - rfGlyph* rf_glyph; - - rf_glyph = (rfGlyph*)glyph; - rfi = (rfContext*)context; - - scanline = (glyph->cx + 7) / 8; - - rf_glyph->pixmap = XCreatePixmap(rfi->display, rfi->drawing, glyph->cx, glyph->cy, 1); - - image = XCreateImage(rfi->display, rfi->visual, 1, - ZPixmap, 0, (char*)glyph->aj, glyph->cx, glyph->cy, 8, scanline); - - image->byte_order = MSBFirst; - image->bitmap_bit_order = MSBFirst; - - XInitImage(image); - XPutImage(rfi->display, rf_glyph->pixmap, rfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); - XFree(image); -#endif - return TRUE; -} - -void rf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - if (((rfGlyph*)glyph)->pixmap != 0) - XFreePixmap(rfi->display, ((rfGlyph*)glyph)->pixmap); -#endif -} - -static BOOL rf_Glyph_Draw(rdpContext* context, const rdpGlyph* glyph, INT32 x, - INT32 y, INT32 w, INT32 h, INT32 sx, INT32 sy, - BOOL fOpRedundant) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfGlyph* rf_glyph; - rfContext* rfi = (rfContext*)context; - - rf_glyph = (rfGlyph*)glyph; - - XSetStipple(rfi->display, rfi->gc, rf_glyph->pixmap); - XSetTSOrigin(rfi->display, rfi->gc, x, y); - XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, glyph->cx, glyph->cy); - XSetStipple(rfi->display, rfi->gc, rfi->bitmap_mono); -#endif - return TRUE; -} - -static BOOL rf_Glyph_BeginDraw(rdpContext* context, INT32 x, INT32 y, - INT32 width, INT32 height, UINT32 bgcolor, - UINT32 fgcolor, BOOL fOpRedundant) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - bgcolor = (rfi->clrconv->invert) ? - freerdp_color_convert_var_bgr(bgcolor, rfi->srcBpp, 32, rfi->clrconv) : - freerdp_color_convert_var_rgb(bgcolor, rfi->srcBpp, 32, rfi->clrconv); - - fgcolor = (rfi->clrconv->invert) ? - freerdp_color_convert_var_bgr(fgcolor, rfi->srcBpp, 32, rfi->clrconv) : - freerdp_color_convert_var_rgb(fgcolor, rfi->srcBpp, 32, rfi->clrconv); - - XSetFunction(rfi->display, rfi->gc, GXcopy); - XSetFillStyle(rfi->display, rfi->gc, FillSolid); - XSetForeground(rfi->display, rfi->gc, fgcolor); - XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, width, height); - - XSetForeground(rfi->display, rfi->gc, bgcolor); - XSetBackground(rfi->display, rfi->gc, fgcolor); - XSetFillStyle(rfi->display, rfi->gc, FillStippled); -#endif - return TRUE; -} - -static BOOL rf_Glyph_EndDraw(rdpContext* context, INT32 x, INT32 y, - INT32 width, INT32 height, - UINT32 bgcolor, UINT32 fgcolor) -{ - TRACE_CALL(__func__); -#ifdef RF_GLYPH - rfContext* rfi = (rfContext*)context; - - if (rfi->drawing == rfi->primary) { - //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, x, y, width, height, x, y); - //gdi_InvalidateRegion(rfi->hdc, x, y, width, height); - } -#endif - return TRUE; -} - /* Graphics Module */ void rf_register_graphics(rdpGraphics* graphics) { TRACE_CALL(__func__); - rdpBitmap* bitmap; - rdpPointer* pointer; - rdpGlyph* glyph; - - bitmap = (rdpBitmap*)malloc(sizeof(rdpBitmap)); - ZeroMemory(bitmap, sizeof(rdpBitmap)); -#ifdef RF_BITMAP - bitmap->size = sizeof(rfBitmap); -#else - bitmap->size = 0; -#endif - - bitmap->New = rf_Bitmap_New; - bitmap->Free = rf_Bitmap_Free; - bitmap->Paint = rf_Bitmap_Paint; - bitmap->Decompress = rf_Bitmap_Decompress; - bitmap->SetSurface = rf_Bitmap_SetSurface; - - graphics_register_bitmap(graphics, bitmap); - free(bitmap); - - pointer = (rdpPointer*)malloc(sizeof(rdpPointer)); - ZeroMemory(pointer, sizeof(rdpPointer)); - - pointer->size = sizeof(rfPointer); - - pointer->New = rf_Pointer_New; - pointer->Free = rf_Pointer_Free; - pointer->Set = rf_Pointer_Set; - pointer->SetNull = rf_Pointer_SetNull; - pointer->SetDefault = rf_Pointer_SetDefault; - pointer->SetPosition = rf_Pointer_SetPosition; - - graphics_register_pointer(graphics, pointer); - - free(pointer); - - glyph = (rdpGlyph*)malloc(sizeof(rdpGlyph)); - ZeroMemory(glyph, sizeof(rdpGlyph)); - -#ifdef RF_GLYPH - glyph->size = sizeof(rfGlyph); -#else - glyph->size = 0; -#endif + rdpPointer pointer={0}; - glyph->New = rf_Glyph_New; - glyph->Free = rf_Glyph_Free; - glyph->Draw = rf_Glyph_Draw; - glyph->BeginDraw = rf_Glyph_BeginDraw; - glyph->EndDraw = rf_Glyph_EndDraw; + pointer.size = sizeof(rfPointer); - graphics_register_glyph(graphics, glyph); + pointer.New = rf_Pointer_New; + pointer.Free = rf_Pointer_Free; + pointer.Set = rf_Pointer_Set; + pointer.SetNull = rf_Pointer_SetNull; + pointer.SetDefault = rf_Pointer_SetDefault; + pointer.SetPosition = rf_Pointer_SetPosition; - free(glyph); + graphics_register_pointer(graphics, &pointer); } |