1 /*
2    rdesktop: A Remote Desktop Protocol client.
3    RDP order processing
4    Copyright (C) Matthew Chapman 1999-2008
5 
6    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
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #define RDP_ORDER_STANDARD   0x01
21 #define RDP_ORDER_SECONDARY  0x02
22 #define RDP_ORDER_BOUNDS     0x04
23 #define RDP_ORDER_CHANGE     0x08
24 #define RDP_ORDER_DELTA      0x10
25 #define RDP_ORDER_LASTBOUNDS 0x20
26 #define RDP_ORDER_SMALL      0x40
27 #define RDP_ORDER_TINY       0x80
28 
29 enum RDP_ORDER_TYPE
30 {
31 	RDP_ORDER_DESTBLT = 0,
32 	RDP_ORDER_PATBLT = 1,
33 	RDP_ORDER_SCREENBLT = 2,
34 	RDP_ORDER_LINE = 9,
35 	RDP_ORDER_RECT = 10,
36 	RDP_ORDER_DESKSAVE = 11,
37 	RDP_ORDER_MEMBLT = 13,
38 	RDP_ORDER_TRIBLT = 14,
39 	RDP_ORDER_POLYGON = 20,
40 	RDP_ORDER_POLYGON2 = 21,
41 	RDP_ORDER_POLYLINE = 22,
42 	RDP_ORDER_ELLIPSE = 25,
43 	RDP_ORDER_ELLIPSE2 = 26,
44 	RDP_ORDER_TEXT2 = 27
45 };
46 
47 enum RDP_SECONDARY_ORDER_TYPE
48 {
49 	RDP_ORDER_RAW_BMPCACHE = 0,
50 	RDP_ORDER_COLCACHE = 1,
51 	RDP_ORDER_BMPCACHE = 2,
52 	RDP_ORDER_FONTCACHE = 3,
53 	RDP_ORDER_RAW_BMPCACHE2 = 4,
54 	RDP_ORDER_BMPCACHE2 = 5,
55 	RDP_ORDER_BRUSHCACHE = 7
56 };
57 
58 typedef struct _DESTBLT_ORDER
59 {
60 	sint16 x;
61 	sint16 y;
62 	sint16 cx;
63 	sint16 cy;
64 	uint8 opcode;
65 
66 }
67 DESTBLT_ORDER;
68 
69 typedef struct _PATBLT_ORDER
70 {
71 	sint16 x;
72 	sint16 y;
73 	sint16 cx;
74 	sint16 cy;
75 	uint8 opcode;
76 	uint32 bgcolour;
77 	uint32 fgcolour;
78 	BRUSH brush;
79 
80 }
81 PATBLT_ORDER;
82 
83 typedef struct _SCREENBLT_ORDER
84 {
85 	sint16 x;
86 	sint16 y;
87 	sint16 cx;
88 	sint16 cy;
89 	uint8 opcode;
90 	sint16 srcx;
91 	sint16 srcy;
92 
93 }
94 SCREENBLT_ORDER;
95 
96 typedef struct _LINE_ORDER
97 {
98 	uint16 mixmode;
99 	sint16 startx;
100 	sint16 starty;
101 	sint16 endx;
102 	sint16 endy;
103 	uint32 bgcolour;
104 	uint8 opcode;
105 	PEN pen;
106 
107 }
108 LINE_ORDER;
109 
110 typedef struct _RECT_ORDER
111 {
112 	sint16 x;
113 	sint16 y;
114 	sint16 cx;
115 	sint16 cy;
116 	uint32 colour;
117 
118 }
119 RECT_ORDER;
120 
121 typedef struct _DESKSAVE_ORDER
122 {
123 	uint32 offset;
124 	sint16 left;
125 	sint16 top;
126 	sint16 right;
127 	sint16 bottom;
128 	uint8 action;
129 
130 }
131 DESKSAVE_ORDER;
132 
133 typedef struct _TRIBLT_ORDER
134 {
135 	uint8 colour_table;
136 	uint8 cache_id;
137 	sint16 x;
138 	sint16 y;
139 	sint16 cx;
140 	sint16 cy;
141 	uint8 opcode;
142 	sint16 srcx;
143 	sint16 srcy;
144 	uint32 bgcolour;
145 	uint32 fgcolour;
146 	BRUSH brush;
147 	uint16 cache_idx;
148 	uint16 unknown;
149 
150 }
151 TRIBLT_ORDER;
152 
153 typedef struct _MEMBLT_ORDER
154 {
155 	uint8 colour_table;
156 	uint8 cache_id;
157 	sint16 x;
158 	sint16 y;
159 	sint16 cx;
160 	sint16 cy;
161 	uint8 opcode;
162 	sint16 srcx;
163 	sint16 srcy;
164 	uint16 cache_idx;
165 
166 }
167 MEMBLT_ORDER;
168 
169 #define MAX_DATA 256
170 
171 typedef struct _POLYGON_ORDER
172 {
173 	sint16 x;
174 	sint16 y;
175 	uint8 opcode;
176 	uint8 fillmode;
177 	uint32 fgcolour;
178 	uint8 npoints;
179 	uint8 datasize;
180 	uint8 data[MAX_DATA];
181 
182 }
183 POLYGON_ORDER;
184 
185 typedef struct _POLYGON2_ORDER
186 {
187 	sint16 x;
188 	sint16 y;
189 	uint8 opcode;
190 	uint8 fillmode;
191 	uint32 bgcolour;
192 	uint32 fgcolour;
193 	BRUSH brush;
194 	uint8 npoints;
195 	uint8 datasize;
196 	uint8 data[MAX_DATA];
197 
198 }
199 POLYGON2_ORDER;
200 
201 typedef struct _POLYLINE_ORDER
202 {
203 	sint16 x;
204 	sint16 y;
205 	uint8 opcode;
206 	uint32 fgcolour;
207 	uint8 lines;
208 	uint8 datasize;
209 	uint8 data[MAX_DATA];
210 
211 }
212 POLYLINE_ORDER;
213 
214 typedef struct _ELLIPSE_ORDER
215 {
216 	sint16 left;
217 	sint16 top;
218 	sint16 right;
219 	sint16 bottom;
220 	uint8 opcode;
221 	uint8 fillmode;
222 	uint32 fgcolour;
223 
224 }
225 ELLIPSE_ORDER;
226 
227 typedef struct _ELLIPSE2_ORDER
228 {
229 	sint16 left;
230 	sint16 top;
231 	sint16 right;
232 	sint16 bottom;
233 	uint8 opcode;
234 	uint8 fillmode;
235 	BRUSH brush;
236 	uint32 bgcolour;
237 	uint32 fgcolour;
238 
239 }
240 ELLIPSE2_ORDER;
241 
242 #define MAX_TEXT 256
243 
244 typedef struct _TEXT2_ORDER
245 {
246 	uint8 font;
247 	uint8 flags;
248 	uint8 opcode;
249 	uint8 mixmode;
250 	uint32 bgcolour;
251 	uint32 fgcolour;
252 	sint16 clipleft;
253 	sint16 cliptop;
254 	sint16 clipright;
255 	sint16 clipbottom;
256 	sint16 boxleft;
257 	sint16 boxtop;
258 	sint16 boxright;
259 	sint16 boxbottom;
260 	BRUSH brush;
261 	sint16 x;
262 	sint16 y;
263 	uint8 length;
264 	uint8 text[MAX_TEXT];
265 
266 }
267 TEXT2_ORDER;
268 
269 typedef struct _RDP_ORDER_STATE
270 {
271 	uint8 order_type;
272 	BOUNDS bounds;
273 
274 	DESTBLT_ORDER destblt;
275 	PATBLT_ORDER patblt;
276 	SCREENBLT_ORDER screenblt;
277 	LINE_ORDER line;
278 	RECT_ORDER rect;
279 	DESKSAVE_ORDER desksave;
280 	MEMBLT_ORDER memblt;
281 	TRIBLT_ORDER triblt;
282 	POLYGON_ORDER polygon;
283 	POLYGON2_ORDER polygon2;
284 	POLYLINE_ORDER polyline;
285 	ELLIPSE_ORDER ellipse;
286 	ELLIPSE2_ORDER ellipse2;
287 	TEXT2_ORDER text2;
288 
289 }
290 RDP_ORDER_STATE;
291 
292 typedef struct _RDP_RAW_BMPCACHE_ORDER
293 {
294 	uint8 cache_id;
295 	uint8 pad1;
296 	uint8 width;
297 	uint8 height;
298 	uint8 bpp;
299 	uint16 bufsize;
300 	uint16 cache_idx;
301 	uint8 *data;
302 
303 }
304 RDP_RAW_BMPCACHE_ORDER;
305 
306 typedef struct _RDP_BMPCACHE_ORDER
307 {
308 	uint8 cache_id;
309 	uint8 pad1;
310 	uint8 width;
311 	uint8 height;
312 	uint8 bpp;
313 	uint16 bufsize;
314 	uint16 cache_idx;
315 	uint16 pad2;
316 	uint16 size;
317 	uint16 row_size;
318 	uint16 final_size;
319 	uint8 *data;
320 
321 }
322 RDP_BMPCACHE_ORDER;
323 
324 /* RDP_BMPCACHE2_ORDER */
325 #define ID_MASK			0x0007
326 #define MODE_MASK		0x0038
327 #define SQUARE			0x0080
328 #define PERSIST			0x0100
329 #define FLAG_51_UNKNOWN		0x0800
330 
331 #define MODE_SHIFT		3
332 
333 #define LONG_FORMAT		0x80
334 #define BUFSIZE_MASK		0x3FFF	/* or 0x1FFF? */
335 
336 #define MAX_GLYPH 32
337 
338 typedef struct _RDP_FONT_GLYPH
339 {
340 	uint16 character;
341 	uint16 unknown;
342 	uint16 baseline;
343 	uint16 width;
344 	uint16 height;
345 	uint8 data[MAX_GLYPH];
346 
347 }
348 RDP_FONT_GLYPH;
349 
350 #define MAX_GLYPHS 256
351 
352 typedef struct _RDP_FONTCACHE_ORDER
353 {
354 	uint8 font;
355 	uint8 nglyphs;
356 	RDP_FONT_GLYPH glyphs[MAX_GLYPHS];
357 
358 }
359 RDP_FONTCACHE_ORDER;
360 
361 typedef struct _RDP_COLCACHE_ORDER
362 {
363 	uint8 cache_id;
364 	COLOURMAP map;
365 
366 }
367 RDP_COLCACHE_ORDER;
368