rdpContext _p;
guac_client* client;
+ CLRCONV* clrconv;
} rdp_freerdp_context;
-extern CLRCONV guac_rdp_clrconv;
-
#endif
void guac_rdp_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt);
void guac_rdp_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt);
void guac_rdp_gdi_opaquerect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect);
+void guac_rdp_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette);
#endif
NULL
};
-CLRCONV guac_rdp_clrconv = {
- .alpha = 1,
- .invert = 0,
- .rgb555 = 0,
- .palette = NULL
-};
-
boolean rdp_freerdp_pre_connect(freerdp* instance) {
rdpContext* context = instance->context;
rdpGlyph* glyph;
rdpPointer* pointer;
rdpPrimaryUpdate* primary;
+ CLRCONV* clrconv;
+
+ /* Init color conversion structure */
+ clrconv = xnew(CLRCONV);
+ clrconv->alpha = 1;
+ clrconv->invert = 0;
+ clrconv->rgb555 = 0;
+ clrconv->palette = xnew(rdpPalette);
+ ((rdp_freerdp_context*) context)->clrconv = clrconv;
/* Init FreeRDP cache */
instance->context->cache = cache_new(instance->settings);
graphics_register_pointer(context->graphics, pointer);
/* Set up GDI */
- primary = instance->update->primary;
+ instance->update->Palette = guac_rdp_gdi_palette_update;
+ primary = instance->update->primary;
primary->DstBlt = guac_rdp_gdi_dstblt;
primary->PatBlt = guac_rdp_gdi_patblt;
primary->ScrBlt = guac_rdp_gdi_scrblt;
unsigned char* image_buffer = freerdp_image_convert(bitmap->data, NULL,
bitmap->width, bitmap->height,
context->instance->settings->color_depth,
- 32, (HCLRCONV) &guac_rdp_clrconv);
+ 32, ((rdp_freerdp_context*) context)->clrconv);
/* If not ephemeral, send to client */
if (!bitmap->ephemeral) {
/* Store converted image in bitmap */
bitmap->data = image_buffer;
+ /* Not stored in a layer */
+ ((guac_rdp_bitmap*) bitmap)->layer = NULL;
+
}
}
void guac_rdp_bitmap_free(rdpContext* context, rdpBitmap* bitmap) {
guac_client* client = ((rdp_freerdp_context*) context)->client;
- guac_client_free_buffer(client, ((guac_rdp_bitmap*) bitmap)->layer);
+
+ /* Free layer, if any */
+ if (((guac_rdp_bitmap*) bitmap)->layer != NULL)
+ guac_client_free_buffer(client, ((guac_rdp_bitmap*) bitmap)->layer);
}
void guac_rdp_bitmap_setsurface(rdpContext* context, rdpBitmap* bitmap, boolean primary) {
guac_client* client = ((rdp_freerdp_context*) context)->client;
uint32 color = freerdp_color_convert(opaque_rect->color,
- context->instance->settings->color_depth, 32, &guac_rdp_clrconv);
+ context->instance->settings->color_depth, 32,
+ ((rdp_freerdp_context*) context)->clrconv);
const guac_layer* current_layer = ((rdp_guac_client_data*) client->data)->current_surface;
}
+void guac_rdp_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) {
+ CLRCONV* clrconv = ((rdp_freerdp_context*) context)->clrconv;
+ clrconv->palette->count = palette->number;
+ clrconv->palette->entries = palette->entries;
+
+}