GUACAMOLE-249: Rely on default bitmap/GDI/pointer handlers for all but those that must be overridden.

This commit is contained in:
Michael Jumper 2019-09-29 15:02:06 -07:00
parent 1e692094be
commit c311d8bde9
2 changed files with 25 additions and 78 deletions

View File

@ -121,16 +121,12 @@ BOOL rdp_freerdp_pre_connect(freerdp* instance) {
rdpContext* context = instance->context; rdpContext* context = instance->context;
rdpChannels* channels = context->channels; rdpChannels* channels = context->channels;
rdpGraphics* graphics = context->graphics;
guac_client* client = ((rdp_freerdp_context*) context)->client; guac_client* client = ((rdp_freerdp_context*) context)->client;
guac_rdp_client* rdp_client = (guac_rdp_client*) client->data; guac_rdp_client* rdp_client = (guac_rdp_client*) client->data;
guac_rdp_settings* settings = rdp_client->settings; guac_rdp_settings* settings = rdp_client->settings;
rdpBitmap* bitmap;
rdpGlyph* glyph;
rdpPointer* pointer;
rdpPrimaryUpdate* primary;
guac_rdp_dvc_list* dvc_list = guac_rdp_dvc_list_alloc(); guac_rdp_dvc_list* dvc_list = guac_rdp_dvc_list_alloc();
/* Init FreeRDP add-in provider */ /* Init FreeRDP add-in provider */
@ -232,44 +228,40 @@ BOOL rdp_freerdp_pre_connect(freerdp* instance) {
instance->context->cache = cache_new(instance->settings); instance->context->cache = cache_new(instance->settings);
/* Set up bitmap handling */ /* Set up bitmap handling */
bitmap = calloc(1, sizeof(rdpBitmap)); rdpBitmap bitmap = *graphics->Bitmap_Prototype;
bitmap->size = sizeof(guac_rdp_bitmap); bitmap.size = sizeof(guac_rdp_bitmap);
bitmap->New = guac_rdp_bitmap_new; bitmap.New = guac_rdp_bitmap_new;
bitmap->Free = guac_rdp_bitmap_free; bitmap.Free = guac_rdp_bitmap_free;
bitmap->Paint = guac_rdp_bitmap_paint; bitmap.Paint = guac_rdp_bitmap_paint;
bitmap->Decompress = guac_rdp_bitmap_decompress; bitmap.SetSurface = guac_rdp_bitmap_setsurface;
bitmap->SetSurface = guac_rdp_bitmap_setsurface; graphics_register_bitmap(graphics, &bitmap);
graphics_register_bitmap(context->graphics, bitmap);
free(bitmap);
/* Set up glyph handling */ /* Set up glyph handling */
glyph = calloc(1, sizeof(rdpGlyph)); rdpGlyph glyph = *graphics->Glyph_Prototype;
glyph->size = sizeof(guac_rdp_glyph); glyph.size = sizeof(guac_rdp_glyph);
glyph->New = guac_rdp_glyph_new; glyph.New = guac_rdp_glyph_new;
glyph->Free = guac_rdp_glyph_free; glyph.Free = guac_rdp_glyph_free;
glyph->Draw = guac_rdp_glyph_draw; glyph.Draw = guac_rdp_glyph_draw;
glyph->BeginDraw = guac_rdp_glyph_begindraw; glyph.BeginDraw = guac_rdp_glyph_begindraw;
glyph->EndDraw = guac_rdp_glyph_enddraw; glyph.EndDraw = guac_rdp_glyph_enddraw;
graphics_register_glyph(context->graphics, glyph); graphics_register_glyph(graphics, &glyph);
free(glyph);
/* Set up pointer handling */ /* Set up pointer handling */
pointer = calloc(1, sizeof(rdpPointer)); rdpPointer pointer = *graphics->Pointer_Prototype;
pointer->size = sizeof(guac_rdp_pointer); pointer.size = sizeof(guac_rdp_pointer);
pointer->New = guac_rdp_pointer_new; pointer.New = guac_rdp_pointer_new;
pointer->Free = guac_rdp_pointer_free; pointer.Free = guac_rdp_pointer_free;
pointer->Set = guac_rdp_pointer_set; pointer.Set = guac_rdp_pointer_set;
pointer->SetNull = guac_rdp_pointer_set_null; pointer.SetNull = guac_rdp_pointer_set_null;
pointer->SetDefault = guac_rdp_pointer_set_default; pointer.SetDefault = guac_rdp_pointer_set_default;
graphics_register_pointer(context->graphics, pointer); graphics_register_pointer(graphics, &pointer);
free(pointer);
/* Set up GDI */ /* Set up GDI */
instance->update->DesktopResize = guac_rdp_gdi_desktop_resize; instance->update->DesktopResize = guac_rdp_gdi_desktop_resize;
instance->update->EndPaint = guac_rdp_gdi_end_paint; instance->update->EndPaint = guac_rdp_gdi_end_paint;
instance->update->SetBounds = guac_rdp_gdi_set_bounds; instance->update->SetBounds = guac_rdp_gdi_set_bounds;
primary = instance->update->primary; rdpPrimaryUpdate* primary = instance->update->primary;
primary->DstBlt = guac_rdp_gdi_dstblt; primary->DstBlt = guac_rdp_gdi_dstblt;
primary->PatBlt = guac_rdp_gdi_patblt; primary->PatBlt = guac_rdp_gdi_patblt;
primary->ScrBlt = guac_rdp_gdi_scrblt; primary->ScrBlt = guac_rdp_gdi_scrblt;

View File

@ -188,48 +188,3 @@ BOOL guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, BOOL pri
} }
BOOL guac_rdp_bitmap_decompress(rdpContext* context, rdpBitmap* bitmap, const BYTE* data,
UINT32 width, UINT32 height, UINT32 bpp, UINT32 length, BOOL compressed, UINT32 codec_id) {
int size = width * height * 4;
/* Free pre-existing data, if any (might be reused) */
if (bitmap->data != NULL)
_aligned_free(bitmap->data);
/* Allocate new data - this MUST be allocated with _aligned_malloc() */
bitmap->data = (UINT8*) _aligned_malloc(size, 16);
if (compressed) {
rdpCodecs* codecs = context->codecs;
/* Decode as interleaved if less than 32 bits per pixel */
if (bpp < 32) {
freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_INTERLEAVED);
interleaved_decompress(codecs->interleaved, data, length, bpp,
&(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height,
(BYTE*) ((rdp_freerdp_context*) context)->palette);
bitmap->bpp = 32;
}
/* Otherwise, decode as planar */
else {
freerdp_client_codecs_prepare(codecs, FREERDP_CODEC_PLANAR);
planar_decompress(codecs->planar, data, length,
&(bitmap->data), PIXEL_FORMAT_XRGB32, -1, 0, 0, width, height,
TRUE);
bitmap->bpp = 32;
}
}
else {
freerdp_image_flip(data, bitmap->data, width, height, bpp);
bitmap->bpp = bpp;
}
bitmap->compressed = FALSE;
bitmap->length = size;
}