summaryrefslogtreecommitdiffstats
path: root/rdp/rdp_orders.c
diff options
context:
space:
mode:
Diffstat (limited to 'rdp/rdp_orders.c')
-rw-r--r--rdp/rdp_orders.c139
1 files changed, 126 insertions, 13 deletions
diff --git a/rdp/rdp_orders.c b/rdp/rdp_orders.c
index a22faa27..5a68b5ef 100644
--- a/rdp/rdp_orders.c
+++ b/rdp/rdp_orders.c
@@ -40,10 +40,16 @@ rdp_orders_delete(struct rdp_orders* self)
int i;
int j;
+ if (self == 0)
+ {
+ return;
+ }
+ /* free the colormap cache */
for (i = 0; i < 6; i++)
{
g_free(self->cache_colormap[i]);
}
+ /* free the bitmap cache */
for (i = 0; i < 3; i++)
{
for (j = 0; j < 600; j++)
@@ -427,6 +433,9 @@ static void APP_CC
rdp_orders_process_text2(struct rdp_orders* self, struct stream* s,
int present, int delta)
{
+ int fgcolor;
+ int bgcolor;
+
if (present & 0x000001)
{
in_uint8(s, self->state.text_font);
@@ -499,10 +508,16 @@ rdp_orders_process_text2(struct rdp_orders* self, struct stream* s,
}
self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod,
self->state.text_opcode);
- self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod,
- self->state.text_fgcolor);
- self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod,
- self->state.text_bgcolor);
+ fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.text_fgcolor,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor);
+ bgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.text_bgcolor,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod, bgcolor);
self->rdp_layer->mod->server_draw_text(self->rdp_layer->mod,
self->state.text_font,
self->state.text_flags,
@@ -564,6 +579,9 @@ static void APP_CC
rdp_orders_process_patblt(struct rdp_orders* self, struct stream* s,
int present, int delta)
{
+ int fgcolor;
+ int bgcolor;
+
if (present & 0x0001)
{
rdp_orders_in_coord(s, &self->state.pat_x, delta);
@@ -596,10 +614,16 @@ rdp_orders_process_patblt(struct rdp_orders* self, struct stream* s,
self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod,
self->state.pat_opcode);
self->rdp_layer->mod->server_set_mixmode(self->rdp_layer->mod, 1);
- self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod,
- self->state.pat_fgcolor);
- self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod,
- self->state.pat_bgcolor);
+ fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.pat_fgcolor,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor);
+ bgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.pat_bgcolor,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_bgcolor(self->rdp_layer->mod, bgcolor);
self->rdp_layer->mod->server_set_brush(self->rdp_layer->mod,
self->state.pat_brush.xorigin,
self->state.pat_brush.yorigin,
@@ -666,6 +690,8 @@ static void APP_CC
rdp_orders_process_line(struct rdp_orders* self, struct stream* s,
int present, int delta)
{
+ int fgcolor;
+
if (present & 0x0001)
{
in_uint16_le(s, self->state.line_mixmode);
@@ -697,8 +723,11 @@ rdp_orders_process_line(struct rdp_orders* self, struct stream* s,
rdp_orders_parse_pen(s, &self->state.line_pen, present >> 7);
self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod,
self->state.line_opcode);
- self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod,
- self->state.line_pen.color);
+ fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.line_pen.color,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor);
self->rdp_layer->mod->server_set_pen(self->rdp_layer->mod,
self->state.line_pen.style,
self->state.line_pen.width);
@@ -717,6 +746,7 @@ rdp_orders_process_rect(struct rdp_orders* self, struct stream* s,
int present, int delta)
{
int i;
+ int fgcolor;
if (present & 0x01)
{
@@ -749,8 +779,11 @@ rdp_orders_process_rect(struct rdp_orders* self, struct stream* s,
in_uint8(s, i);
self->state.rect_color = (self->state.rect_color & 0xff00ffff) | (i << 16);
}
- self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod,
- self->state.rect_color);
+ fgcolor = rdp_orders_convert_color(self->rdp_layer->mod->rdp_bpp,
+ self->rdp_layer->mod->xrdp_bpp,
+ self->state.rect_color,
+ self->rdp_layer->colormap.colors);
+ self->rdp_layer->mod->server_set_fgcolor(self->rdp_layer->mod, fgcolor);
self->rdp_layer->mod->server_fill_rect(self->rdp_layer->mod,
self->state.rect_x,
self->state.rect_y,
@@ -810,6 +843,7 @@ rdp_orders_process_memblt(struct rdp_orders* self, struct stream* s,
int present, int delta)
{
struct rdp_bitmap* bitmap;
+ char* bmpdata;
if (present & 0x0001)
{
@@ -854,17 +888,27 @@ rdp_orders_process_memblt(struct rdp_orders* self, struct stream* s,
{
self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod,
self->state.memblt_opcode);
+ bmpdata = rdp_orders_convert_bitmap(self->rdp_layer->mod->xrdp_bpp,
+ self->rdp_layer->mod->rdp_bpp,
+ bitmap->data, bitmap->width,
+ bitmap->height,
+ self->cache_colormap
+ [self->state.memblt_color_table]->colors);
self->rdp_layer->mod->server_paint_rect(self->rdp_layer->mod,
self->state.memblt_x,
self->state.memblt_y,
self->state.memblt_cx,
self->state.memblt_cy,
- bitmap->data,
+ bmpdata,
bitmap->width,
bitmap->height,
self->state.memblt_srcx,
self->state.memblt_srcy);
self->rdp_layer->mod->server_set_opcode(self->rdp_layer->mod, 0xcc);
+ if (bmpdata != bitmap->data)
+ {
+ g_free(bmpdata);
+ }
}
}
@@ -1015,3 +1059,72 @@ rdp_orders_process_orders(struct rdp_orders* self, struct stream* s,
}
return 0;
}
+
+/*****************************************************************************/
+/* returns pointer, it might return bmpdata if the data dosen't need to
+ be converted, else it mallocs it. The calling function must free
+ it if needed */
+char* APP_CC
+rdp_orders_convert_bitmap(int in_bpp, int out_bpp, char* bmpdata,
+ int width, int height, int* palette)
+{
+ char* out;
+ char* src;
+ char* dst;
+ int i;
+ int j;
+ int red;
+ int green;
+ int blue;
+ int pixel;
+
+ if (in_bpp == out_bpp && in_bpp == 16)
+ {
+ return bmpdata;
+ }
+ if (in_bpp == 8 && out_bpp == 8)
+ {
+ out = g_malloc(width * height, 0);
+ src = bmpdata;
+ dst = out;
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ pixel = *((unsigned char*)src);
+ pixel = palette[pixel];
+ SPLITCOLOR32(red, green, blue, pixel);
+ pixel = COLOR8(red, green, blue);
+ *dst = pixel;
+ src++;
+ dst++;
+ }
+ }
+ return out;
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+/* returns color or 0 */
+int APP_CC
+rdp_orders_convert_color(int in_bpp, int out_bpp, int in_color, int* palette)
+{
+ int pixel;
+ int red;
+ int green;
+ int blue;
+
+ if (in_bpp == out_bpp && in_bpp == 16)
+ {
+ return in_color;
+ }
+ if (in_bpp == 8 && out_bpp == 8)
+ {
+ pixel = palette[in_color];
+ SPLITCOLOR32(red, green, blue, pixel);
+ pixel = COLOR8(red, green, blue);
+ return pixel;
+ }
+ return 0;
+}