1 |
/* -*- c-basic-offset: 8 -*- |
/* -*- c-basic-offset: 8 -*- |
2 |
rdesktop: A Remote Desktop Protocol client. |
rdesktop: A Remote Desktop Protocol client. |
3 |
RDP order processing |
RDP order processing |
4 |
Copyright (C) Matthew Chapman 1999-2005 |
Copyright (C) Matthew Chapman 1999-2007 |
5 |
|
|
6 |
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
7 |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
379 |
static void |
static void |
380 |
process_memblt(STREAM s, MEMBLT_ORDER * os, uint32 present, BOOL delta) |
process_memblt(STREAM s, MEMBLT_ORDER * os, uint32 present, BOOL delta) |
381 |
{ |
{ |
382 |
HBITMAP bitmap; |
RD_HBITMAP bitmap; |
383 |
|
|
384 |
if (present & 0x0001) |
if (present & 0x0001) |
385 |
{ |
{ |
425 |
static void |
static void |
426 |
process_triblt(STREAM s, TRIBLT_ORDER * os, uint32 present, BOOL delta) |
process_triblt(STREAM s, TRIBLT_ORDER * os, uint32 present, BOOL delta) |
427 |
{ |
{ |
428 |
HBITMAP bitmap; |
RD_HBITMAP bitmap; |
429 |
|
|
430 |
if (present & 0x000001) |
if (present & 0x000001) |
431 |
{ |
{ |
486 |
{ |
{ |
487 |
int index, data, next; |
int index, data, next; |
488 |
uint8 flags = 0; |
uint8 flags = 0; |
489 |
POINT *points; |
RD_POINT *points; |
490 |
|
|
491 |
if (present & 0x01) |
if (present & 0x01) |
492 |
rdp_in_coord(s, &os->x, delta); |
rdp_in_coord(s, &os->x, delta); |
528 |
return; |
return; |
529 |
} |
} |
530 |
|
|
531 |
points = (POINT *) xmalloc((os->npoints + 1) * sizeof(POINT)); |
points = (RD_POINT *) xmalloc((os->npoints + 1) * sizeof(RD_POINT)); |
532 |
memset(points, 0, (os->npoints + 1) * sizeof(POINT)); |
memset(points, 0, (os->npoints + 1) * sizeof(RD_POINT)); |
533 |
|
|
534 |
points[0].x = os->x; |
points[0].x = os->x; |
535 |
points[0].y = os->y; |
points[0].y = os->y; |
565 |
{ |
{ |
566 |
int index, data, next; |
int index, data, next; |
567 |
uint8 flags = 0; |
uint8 flags = 0; |
568 |
POINT *points; |
RD_POINT *points; |
569 |
|
|
570 |
if (present & 0x0001) |
if (present & 0x0001) |
571 |
rdp_in_coord(s, &os->x, delta); |
rdp_in_coord(s, &os->x, delta); |
613 |
return; |
return; |
614 |
} |
} |
615 |
|
|
616 |
points = (POINT *) xmalloc((os->npoints + 1) * sizeof(POINT)); |
points = (RD_POINT *) xmalloc((os->npoints + 1) * sizeof(RD_POINT)); |
617 |
memset(points, 0, (os->npoints + 1) * sizeof(POINT)); |
memset(points, 0, (os->npoints + 1) * sizeof(RD_POINT)); |
618 |
|
|
619 |
points[0].x = os->x; |
points[0].x = os->x; |
620 |
points[0].y = os->y; |
points[0].y = os->y; |
651 |
int index, next, data; |
int index, next, data; |
652 |
uint8 flags = 0; |
uint8 flags = 0; |
653 |
PEN pen; |
PEN pen; |
654 |
POINT *points; |
RD_POINT *points; |
655 |
|
|
656 |
if (present & 0x01) |
if (present & 0x01) |
657 |
rdp_in_coord(s, &os->x, delta); |
rdp_in_coord(s, &os->x, delta); |
690 |
return; |
return; |
691 |
} |
} |
692 |
|
|
693 |
points = (POINT *) xmalloc((os->lines + 1) * sizeof(POINT)); |
points = (RD_POINT *) xmalloc((os->lines + 1) * sizeof(RD_POINT)); |
694 |
memset(points, 0, (os->lines + 1) * sizeof(POINT)); |
memset(points, 0, (os->lines + 1) * sizeof(RD_POINT)); |
695 |
|
|
696 |
points[0].x = os->x; |
points[0].x = os->x; |
697 |
points[0].y = os->y; |
points[0].y = os->y; |
698 |
|
pen.style = pen.width = 0; |
699 |
|
pen.colour = os->fgcolour; |
700 |
|
|
701 |
index = 0; |
index = 0; |
702 |
data = ((os->lines - 1) / 4) + 1; |
data = ((os->lines - 1) / 4) + 1; |
703 |
for (next = 1; (next < os->lines) && (data < os->datasize); next++) |
for (next = 1; (next <= os->lines) && (data < os->datasize); next++) |
704 |
{ |
{ |
705 |
if ((next - 1) % 4 == 0) |
if ((next - 1) % 4 == 0) |
706 |
flags = os->data[index++]; |
flags = os->data[index++]; |
718 |
ui_polyline(os->opcode - 1, points, os->lines + 1, &pen); |
ui_polyline(os->opcode - 1, points, os->lines + 1, &pen); |
719 |
else |
else |
720 |
error("polyline parse error\n"); |
error("polyline parse error\n"); |
721 |
|
|
722 |
|
xfree(points); |
723 |
} |
} |
724 |
|
|
725 |
/* Process an ellipse order */ |
/* Process an ellipse order */ |
874 |
static void |
static void |
875 |
process_raw_bmpcache(STREAM s) |
process_raw_bmpcache(STREAM s) |
876 |
{ |
{ |
877 |
HBITMAP bitmap; |
RD_HBITMAP bitmap; |
878 |
uint16 cache_idx, bufsize; |
uint16 cache_idx, bufsize; |
879 |
uint8 cache_id, width, height, bpp, Bpp; |
uint8 cache_id, width, height, bpp, Bpp; |
880 |
uint8 *data, *inverted; |
uint8 *data, *inverted; |
907 |
static void |
static void |
908 |
process_bmpcache(STREAM s) |
process_bmpcache(STREAM s) |
909 |
{ |
{ |
910 |
HBITMAP bitmap; |
RD_HBITMAP bitmap; |
911 |
uint16 cache_idx, size; |
uint16 cache_idx, size; |
912 |
uint8 cache_id, width, height, bpp, Bpp; |
uint8 cache_id, width, height, bpp, Bpp; |
913 |
uint8 *data, *bmpdata; |
uint8 *data, *bmpdata; |
963 |
static void |
static void |
964 |
process_bmpcache2(STREAM s, uint16 flags, BOOL compressed) |
process_bmpcache2(STREAM s, uint16 flags, BOOL compressed) |
965 |
{ |
{ |
966 |
HBITMAP bitmap; |
RD_HBITMAP bitmap; |
967 |
int y; |
int y; |
968 |
uint8 cache_id, cache_idx_low, width, height, Bpp; |
uint8 cache_id, cache_idx_low, width, height, Bpp; |
969 |
uint16 cache_idx, bufsize; |
uint16 cache_idx, bufsize; |
1045 |
{ |
{ |
1046 |
COLOURENTRY *entry; |
COLOURENTRY *entry; |
1047 |
COLOURMAP map; |
COLOURMAP map; |
1048 |
HCOLOURMAP hmap; |
RD_HCOLOURMAP hmap; |
1049 |
uint8 cache_id; |
uint8 cache_id; |
1050 |
int i; |
int i; |
1051 |
|
|
1066 |
DEBUG(("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours)); |
DEBUG(("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours)); |
1067 |
|
|
1068 |
hmap = ui_create_colourmap(&map); |
hmap = ui_create_colourmap(&map); |
1069 |
ui_set_colourmap(hmap); |
|
1070 |
|
if (cache_id) |
1071 |
|
ui_set_colourmap(hmap); |
1072 |
|
|
1073 |
xfree(map.colours); |
xfree(map.colours); |
1074 |
} |
} |
1077 |
static void |
static void |
1078 |
process_fontcache(STREAM s) |
process_fontcache(STREAM s) |
1079 |
{ |
{ |
1080 |
HGLYPH bitmap; |
RD_HGLYPH bitmap; |
1081 |
uint8 font, nglyphs; |
uint8 font, nglyphs; |
1082 |
uint16 character, offset, baseline, width, height; |
uint16 character, offset, baseline, width, height; |
1083 |
int i, datasize; |
int i, datasize; |