/[rdesktop]/sourceforge.net/trunk/rdesktop/orders.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/orders.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 23 by matty, Tue Oct 17 08:24:09 2000 UTC revision 82 by astrand, Tue Jul 30 07:18:48 2002 UTC
# Line 1  Line 1 
1  /*  /*
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-2000     Copyright (C) Matthew Chapman 1999-2001
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
# Line 21  Line 21 
21  #include "rdesktop.h"  #include "rdesktop.h"
22  #include "orders.h"  #include "orders.h"
23    
24  extern unsigned char *next_packet;  extern uint8 *next_packet;
25  static RDP_ORDER_STATE order_state;  static RDP_ORDER_STATE order_state;
26    
27  /* Read field indicating which parameters are present */  /* Read field indicating which parameters are present */
28  static void rdp_in_present(STREAM s, uint32 *present, uint8 flags, int size)  static void
29    rdp_in_present(STREAM s, uint32 * present, uint8 flags, int size)
30  {  {
31          uint8 bits;          uint8 bits;
32          int i;          int i;
# Line 52  static void rdp_in_present(STREAM s, uin Line 53  static void rdp_in_present(STREAM s, uin
53  }  }
54    
55  /* Read a co-ordinate (16-bit, or 8-bit delta) */  /* Read a co-ordinate (16-bit, or 8-bit delta) */
56  static void rdp_in_coord(STREAM s, uint16 *coord, BOOL delta)  static void
57    rdp_in_coord(STREAM s, uint16 * coord, BOOL delta)
58  {  {
59          uint8 change;          uint8 change;
60    
61          if (delta)          if (delta)
62          {          {
63                  in_uint8(s, change);                  in_uint8(s, change);
64                  *coord += (char)change;                  *coord += (signed char) change;
65          }          }
66          else          else
67          {          {
# Line 68  static void rdp_in_coord(STREAM s, uint1 Line 70  static void rdp_in_coord(STREAM s, uint1
70  }  }
71    
72  /* Read a colour entry */  /* Read a colour entry */
73  static void rdp_in_colour(STREAM s, uint8 *colour)  static void
74    rdp_in_colour(STREAM s, uint8 * colour)
75  {  {
76          in_uint8(s, *colour);          in_uint8(s, *colour);
77          s->p += 2;          s->p += 2;
78  }  }
79    
80  /* Parse bounds information */  /* Parse bounds information */
81  static BOOL rdp_parse_bounds(STREAM s, BOUNDS *bounds)  static BOOL
82    rdp_parse_bounds(STREAM s, BOUNDS * bounds)
83  {  {
84          uint8 present;          uint8 present;
85    
# Line 105  static BOOL rdp_parse_bounds(STREAM s, B Line 109  static BOOL rdp_parse_bounds(STREAM s, B
109  }  }
110    
111  /* Parse a pen */  /* Parse a pen */
112  static BOOL rdp_parse_pen(STREAM s, PEN *pen, uint32 present)  static BOOL
113    rdp_parse_pen(STREAM s, PEN * pen, uint32 present)
114  {  {
115          if (present & 1)          if (present & 1)
116                  in_uint8(s, pen->style);                  in_uint8(s, pen->style);
# Line 120  static BOOL rdp_parse_pen(STREAM s, PEN Line 125  static BOOL rdp_parse_pen(STREAM s, PEN
125  }  }
126    
127  /* Parse a brush */  /* Parse a brush */
128  static BOOL rdp_parse_brush(STREAM s, BRUSH *brush, uint32 present)  static BOOL
129    rdp_parse_brush(STREAM s, BRUSH * brush, uint32 present)
130  {  {
131          if (present & 1)          if (present & 1)
132                  in_uint8(s, brush->xorigin);                  in_uint8(s, brush->xorigin);
# Line 141  static BOOL rdp_parse_brush(STREAM s, BR Line 147  static BOOL rdp_parse_brush(STREAM s, BR
147  }  }
148    
149  /* Process a destination blt order */  /* Process a destination blt order */
150  static void process_destblt(STREAM s, DESTBLT_ORDER *os,  static void
151                                  uint32 present, BOOL delta)  process_destblt(STREAM s, DESTBLT_ORDER * os, uint32 present, BOOL delta)
152  {  {
153          if (present & 0x01)          if (present & 0x01)
154                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 159  static void process_destblt(STREAM s, DE Line 165  static void process_destblt(STREAM s, DE
165          if (present & 0x10)          if (present & 0x10)
166                  in_uint8(s, os->opcode);                  in_uint8(s, os->opcode);
167    
168          DEBUG("DESTBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d)\n",          DEBUG(("DESTBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d)\n",
169                os->opcode, os->x, os->y, os->cx, os->cy);                 os->opcode, os->x, os->y, os->cx, os->cy));
170    
171          ui_destblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy);          ui_destblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy);
172  }  }
173    
174  /* Process a pattern blt order */  /* Process a pattern blt order */
175  static void process_patblt(STREAM s, PATBLT_ORDER *os,  static void
176                                  uint32 present, BOOL delta)  process_patblt(STREAM s, PATBLT_ORDER * os, uint32 present, BOOL delta)
177  {  {
178          if (present & 0x0001)          if (present & 0x0001)
179                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 192  static void process_patblt(STREAM s, PAT Line 198  static void process_patblt(STREAM s, PAT
198    
199          rdp_parse_brush(s, &os->brush, present >> 7);          rdp_parse_brush(s, &os->brush, present >> 7);
200    
201          DEBUG("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n",          DEBUG(("PATBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,bs=%d,bg=0x%x,fg=0x%x)\n", os->opcode, os->x,
202                os->opcode, os->x, os->y, os->cx, os->cy,                 os->y, os->cx, os->cy, os->brush.style, os->bgcolour, os->fgcolour));
               os->brush.style, os->bgcolour, os->fgcolour);  
203    
204          ui_patblt(ROP2_P(os->opcode), os->x, os->y, os->cx, os->cy,          ui_patblt(ROP2_P(os->opcode), os->x, os->y, os->cx, os->cy,
205                                  &os->brush, os->bgcolour, os->fgcolour);                    &os->brush, os->bgcolour, os->fgcolour);
206  }  }
207    
208  /* Process a screen blt order */  /* Process a screen blt order */
209  static void process_screenblt(STREAM s, SCREENBLT_ORDER *os,  static void
210                                          uint32 present, BOOL delta)  process_screenblt(STREAM s, SCREENBLT_ORDER * os, uint32 present, BOOL delta)
211  {  {
212          if (present & 0x0001)          if (present & 0x0001)
213                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 225  static void process_screenblt(STREAM s, Line 230  static void process_screenblt(STREAM s,
230          if (present & 0x0040)          if (present & 0x0040)
231                  rdp_in_coord(s, &os->srcy, delta);                  rdp_in_coord(s, &os->srcy, delta);
232    
233          DEBUG("SCREENBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,srcx=%d,srcy=%d)\n",          DEBUG(("SCREENBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,srcx=%d,srcy=%d)\n",
234                os->opcode, os->x, os->y, os->cx, os->cy, os->srcx, os->srcy);                 os->opcode, os->x, os->y, os->cx, os->cy, os->srcx, os->srcy));
235    
236          ui_screenblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy,          ui_screenblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy, os->srcx, os->srcy);
                                 os->srcx, os->srcy);  
237  }  }
238    
239  /* Process a line order */  /* Process a line order */
240  static void process_line(STREAM s, LINE_ORDER *os, uint32 present, BOOL delta)  static void
241    process_line(STREAM s, LINE_ORDER * os, uint32 present, BOOL delta)
242  {  {
243          if (present & 0x0001)          if (present & 0x0001)
244                  in_uint16_le(s, os->mixmode);                  in_uint16_le(s, os->mixmode);
# Line 258  static void process_line(STREAM s, LINE_ Line 263  static void process_line(STREAM s, LINE_
263    
264          rdp_parse_pen(s, &os->pen, present >> 7);          rdp_parse_pen(s, &os->pen, present >> 7);
265    
266          DEBUG("LINE(op=0x%x,sx=%d,sy=%d,dx=%d,dx=%d,fg=0x%x)\n",          DEBUG(("LINE(op=0x%x,sx=%d,sy=%d,dx=%d,dx=%d,fg=0x%x)\n",
267                os->opcode, os->startx, os->starty, os->endx, os->endy,                 os->opcode, os->startx, os->starty, os->endx, os->endy, os->pen.colour));
               os->pen.colour);  
268    
269          if (os->opcode < 0x01 || os->opcode > 0x10)          if (os->opcode < 0x01 || os->opcode > 0x10)
270          {          {
271                  ERROR("bad ROP2 0x%x\n", os->opcode);                  error("bad ROP2 0x%x\n", os->opcode);
272                  return;                  return;
273          }          }
274    
275          ui_line(os->opcode-1, os->startx, os->starty,          ui_line(os->opcode - 1, os->startx, os->starty, os->endx, os->endy, &os->pen);
                         os->endx, os->endy, &os->pen);  
276  }  }
277    
278  /* Process an opaque rectangle order */  /* Process an opaque rectangle order */
279  static void process_rect(STREAM s, RECT_ORDER *os, uint32 present, BOOL delta)  static void
280    process_rect(STREAM s, RECT_ORDER * os, uint32 present, BOOL delta)
281  {  {
282          if (present & 0x01)          if (present & 0x01)
283                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 290  static void process_rect(STREAM s, RECT_ Line 294  static void process_rect(STREAM s, RECT_
294          if (present & 0x10)          if (present & 0x10)
295                  in_uint8(s, os->colour);                  in_uint8(s, os->colour);
296    
297          DEBUG("RECT(x=%d,y=%d,cx=%d,cy=%d,fg=0x%x)\n",          DEBUG(("RECT(x=%d,y=%d,cx=%d,cy=%d,fg=0x%x)\n", os->x, os->y, os->cx, os->cy, os->colour));
               os->x, os->y, os->cx, os->cy, os->colour);  
298    
299          ui_rect(os->x, os->y, os->cx, os->cy, os->colour);          ui_rect(os->x, os->y, os->cx, os->cy, os->colour);
300  }  }
301    
302  /* Process a desktop save order */  /* Process a desktop save order */
303  static void process_desksave(STREAM s, DESKSAVE_ORDER *os,  static void
304                                  uint32 present, BOOL delta)  process_desksave(STREAM s, DESKSAVE_ORDER * os, uint32 present, BOOL delta)
305  {  {
306          int width, height;          int width, height;
307    
# Line 320  static void process_desksave(STREAM s, D Line 323  static void process_desksave(STREAM s, D
323          if (present & 0x20)          if (present & 0x20)
324                  in_uint8(s, os->action);                  in_uint8(s, os->action);
325    
326          DEBUG("DESKSAVE(l=%d,t=%d,r=%d,b=%d,off=%d,op=%d)\n",          DEBUG(("DESKSAVE(l=%d,t=%d,r=%d,b=%d,off=%d,op=%d)\n",
327                os->left, os->top, os->right, os->bottom, os->offset,                 os->left, os->top, os->right, os->bottom, os->offset, os->action));
               os->action);  
328    
329          width = os->right - os->left + 1;          width = os->right - os->left + 1;
330          height = os->bottom - os->top + 1;          height = os->bottom - os->top + 1;
# Line 334  static void process_desksave(STREAM s, D Line 336  static void process_desksave(STREAM s, D
336  }  }
337    
338  /* Process a memory blt order */  /* Process a memory blt order */
339  static void process_memblt(STREAM s, MEMBLT_ORDER *os,  static void
340                                  uint32 present, BOOL delta)  process_memblt(STREAM s, MEMBLT_ORDER * os, uint32 present, BOOL delta)
341  {  {
342          HBITMAP bitmap;          HBITMAP bitmap;
343    
# Line 369  static void process_memblt(STREAM s, MEM Line 371  static void process_memblt(STREAM s, MEM
371          if (present & 0x0100)          if (present & 0x0100)
372                  in_uint16_le(s, os->cache_idx);                  in_uint16_le(s, os->cache_idx);
373    
374          DEBUG("MEMBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d)\n",          DEBUG(("MEMBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d)\n",
375                os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,                 os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id, os->cache_idx));
               os->cache_idx);  
376    
377          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
378          if (bitmap == NULL)          if (bitmap == NULL)
379                  return;                  return;
380    
381          ui_memblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy,          ui_memblt(ROP2_S(os->opcode), os->x, os->y, os->cx, os->cy, bitmap, os->srcx, os->srcy);
                         bitmap, os->srcx, os->srcy);  
382  }  }
383    
384  /* Process a 3-way blt order */  /* Process a 3-way blt order */
385  static void process_triblt(STREAM s, TRIBLT_ORDER *os,  static void
386                                  uint32 present, BOOL delta)  process_triblt(STREAM s, TRIBLT_ORDER * os, uint32 present, BOOL delta)
387  {  {
388          HBITMAP bitmap;          HBITMAP bitmap;
389    
# Line 428  static void process_triblt(STREAM s, TRI Line 428  static void process_triblt(STREAM s, TRI
428          if (present & 0x010000)          if (present & 0x010000)
429                  in_uint16_le(s, os->unknown);                  in_uint16_le(s, os->unknown);
430    
431          DEBUG("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n",          DEBUG(("TRIBLT(op=0x%x,x=%d,y=%d,cx=%d,cy=%d,id=%d,idx=%d,bs=%d,bg=0x%x,fg=0x%x)\n",
432                os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,                 os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id, os->cache_idx,
433                os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour);                 os->brush.style, os->bgcolour, os->fgcolour));
434    
435          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
436          if (bitmap == NULL)          if (bitmap == NULL)
437                  return;                  return;
438    
439          ui_triblt(os->opcode, os->x, os->y, os->cx, os->cy,          ui_triblt(os->opcode, os->x, os->y, os->cx, os->cy,
440                          bitmap, os->srcx, os->srcy,                    bitmap, os->srcx, os->srcy, &os->brush, os->bgcolour, os->fgcolour);
                         &os->brush, os->bgcolour, os->fgcolour);  
441  }  }
442    
443  /* Parse a delta co-ordinate in polyline order form */  /* Parse a delta co-ordinate in polyline order form */
444  static int parse_delta(uint8 *buffer, int *offset)  static int
445    parse_delta(uint8 * buffer, int *offset)
446  {  {
447          int value = buffer[(*offset)++];          int value = buffer[(*offset)++];
448          int two_byte = value & 0x80;          int two_byte = value & 0x80;
449    
450          if (value & 0x40) /* sign bit */          if (value & 0x40)       /* sign bit */
451                  value |= ~0x3f;                  value |= ~0x3f;
452          else          else
453                  value &= 0x3f;                  value &= 0x3f;
# Line 459  static int parse_delta(uint8 *buffer, in Line 459  static int parse_delta(uint8 *buffer, in
459  }  }
460    
461  /* Process a polyline order */  /* Process a polyline order */
462  static void process_polyline(STREAM s, POLYLINE_ORDER *os,  static void
463                                  uint32 present, BOOL delta)  process_polyline(STREAM s, POLYLINE_ORDER * os, uint32 present, BOOL delta)
464  {  {
465          int index, line, data;          int index, line, data;
466          int x, y, xfrom, yfrom;          int x, y, xfrom, yfrom;
467          uint8 flags = 0;          uint8 flags = 0;
468          PEN pen;          PEN pen;
469            uint8 opcode;
470    
471          if (present & 0x01)          if (present & 0x01)
472                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 487  static void process_polyline(STREAM s, P Line 488  static void process_polyline(STREAM s, P
488                  in_uint8(s, os->datasize);                  in_uint8(s, os->datasize);
489                  in_uint8a(s, os->data, os->datasize);                  in_uint8a(s, os->data, os->datasize);
490          }          }
491            if (os->flags & 1)
492                    opcode = ROP2_COPY;
493            else
494                    opcode = ROP2_NXOR;
495    
496          DEBUG("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",          DEBUG(("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",
497                  os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize);                 os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize));
498    
499          DEBUG("Data: ");          DEBUG(("Data: "));
500    
501          for (index = 0; index < os->datasize; index++)          for (index = 0; index < os->datasize; index++)
502                  DEBUG("%02x ", os->data[index]);                  DEBUG(("%02x ", os->data[index]));
503    
504          DEBUG("\n");          DEBUG(("\n"));
505    
506          x = os->x;          x = os->x;
507          y = os->y;          y = os->y;
# Line 514  static void process_polyline(STREAM s, P Line 519  static void process_polyline(STREAM s, P
519                          flags = os->data[index++];                          flags = os->data[index++];
520    
521                  if ((flags & 0xc0) == 0)                  if ((flags & 0xc0) == 0)
522                          flags |= 0xc0;   /* none = both */                          flags |= 0xc0;  /* none = both */
523    
524                  if (flags & 0x40)                  if (flags & 0x40)
525                          x += parse_delta(os->data, &data);                          x += parse_delta(os->data, &data);
# Line 522  static void process_polyline(STREAM s, P Line 527  static void process_polyline(STREAM s, P
527                  if (flags & 0x80)                  if (flags & 0x80)
528                          y += parse_delta(os->data, &data);                          y += parse_delta(os->data, &data);
529    
530                  ui_line(ROP2_COPY, xfrom, yfrom, x, y, &pen);                  ui_line(opcode, xfrom, yfrom, x, y, &pen);
531    
532                  flags <<= 2;                  flags <<= 2;
533          }          }
534  }  }
535    
536  /* Process a text order */  /* Process a text order */
537  static void process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)  static void
538    process_text2(STREAM s, TEXT2_ORDER * os, uint32 present, BOOL delta)
539  {  {
         DATABLOB *entry;  
540          int i;          int i;
541    
542          if (present & 0x000001)          if (present & 0x000001)
# Line 588  static void process_text2(STREAM s, TEXT Line 593  static void process_text2(STREAM s, TEXT
593                  in_uint8a(s, os->text, os->length);                  in_uint8a(s, os->text, os->length);
594          }          }
595    
596          DEBUG("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n",          DEBUG(("TEXT2(x=%d,y=%d,cl=%d,ct=%d,cr=%d,cb=%d,bl=%d,bt=%d,bb=%d,br=%d,fg=0x%x,bg=0x%x,font=%d,fl=0x%x,mix=%d,unk=0x%x,n=%d)\n", os->x, os->y, os->clipleft, os->cliptop, os->clipright, os->clipbottom, os->boxleft, os->boxtop, os->boxright, os->boxbottom, os->fgcolour, os->bgcolour, os->font, os->flags, os->mixmode, os->unknown, os->length));
                 os->x, os->y, os->clipleft, os->cliptop, os->clipright,  
                 os->clipbottom, os->boxleft, os->boxtop, os->boxright,  
                 os->boxbottom, os->fgcolour, os->bgcolour, os->font,  
                 os->flags, os->mixmode, os->unknown, os->length);  
597    
598          DEBUG("Text: ");          DEBUG(("Text: "));
599    
600          for (i = 0; i < os->length; i++)          for (i = 0; i < os->length; i++)
601                  DEBUG("%02x ", os->text[i]);                  DEBUG(("%02x ", os->text[i]));
   
         DEBUG("\n");  
   
         /* Process special cache strings */  
         if ((os->length >= 2) && (os->text[0] == 0xfe))  
         {  
                 entry = cache_get_text(os->text[1]);  
602    
603                  if (entry == NULL)          DEBUG(("\n"));
                         return;  
                   
                 memcpy(os->text, entry->data, entry->size);  
                 os->length = entry->size;  
         }  
         else if ((os->length >= 3) && (os->text[os->length-3] == 0xff))  
         {  
                 os->length -= 3;  
                 cache_put_text(os->text[os->length+1], os->text, os->length);  
         }  
604    
605          ui_draw_text(os->font, os->flags, os->mixmode, os->x, os->y,          ui_draw_text(os->font, os->flags, os->mixmode, os->x, os->y,
606                          os->clipleft, os->cliptop,                       os->clipleft, os->cliptop,
607                          os->clipright - os->clipleft,                       os->clipright - os->clipleft,
608                          os->clipbottom - os->cliptop,                       os->clipbottom - os->cliptop,
609                          os->boxleft, os->boxtop,                       os->boxleft, os->boxtop,
610                          os->boxright - os->boxleft,                       os->boxright - os->boxleft,
611                          os->boxbottom - os->boxtop,                       os->boxbottom - os->boxtop, os->bgcolour, os->fgcolour, os->text, os->length);
                         os->bgcolour, os->fgcolour, os->text, os->length);  
612  }  }
613    
614  /* Process a raw bitmap cache order */  /* Process a raw bitmap cache order */
615  static void process_raw_bmpcache(STREAM s)  static void
616    process_raw_bmpcache(STREAM s)
617  {  {
618          HBITMAP bitmap;          HBITMAP bitmap;
619          uint16 cache_idx, bufsize;          uint16 cache_idx, bufsize;
620          uint8 cache_id, width, height, bpp;          uint8 cache_id, width, height, bpp;
621          uint8 *data;          uint8 *data, *inverted;
622            int y;
623    
624          in_uint8(s, cache_id);          in_uint8(s, cache_id);
625          in_uint8s(s, 1); /* pad */          in_uint8s(s, 1);        /* pad */
626          in_uint8(s, width);          in_uint8(s, width);
627          in_uint8(s, height);          in_uint8(s, height);
628          in_uint8(s, bpp);          in_uint8(s, bpp);
# Line 645  static void process_raw_bmpcache(STREAM Line 630  static void process_raw_bmpcache(STREAM
630          in_uint16_le(s, cache_idx);          in_uint16_le(s, cache_idx);
631          in_uint8p(s, data, bufsize);          in_uint8p(s, data, bufsize);
632    
633          DEBUG("RAW_BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",          DEBUG(("RAW_BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n", width, height, cache_id, cache_idx));
634                width, height, cache_id, cache_idx);          inverted = xmalloc(width * height);
635            for (y = 0; y < height; y++)
636            {
637                    memcpy(&inverted[(height - y - 1) * width], &data[y * width], width);
638            }
639    
640          bitmap = ui_create_bitmap(width, height, data);          bitmap = ui_create_bitmap(width, height, inverted);
641            xfree(inverted);
642          cache_put_bitmap(cache_id, cache_idx, bitmap);          cache_put_bitmap(cache_id, cache_idx, bitmap);
643  }  }
644    
645  /* Process a bitmap cache order */  /* Process a bitmap cache order */
646  static void process_bmpcache(STREAM s)  static void
647    process_bmpcache(STREAM s)
648  {  {
649          HBITMAP bitmap;          HBITMAP bitmap;
650          uint16 cache_idx, size;          uint16 cache_idx, size;
# Line 661  static void process_bmpcache(STREAM s) Line 652  static void process_bmpcache(STREAM s)
652          uint8 *data, *bmpdata;          uint8 *data, *bmpdata;
653    
654          in_uint8(s, cache_id);          in_uint8(s, cache_id);
655          in_uint8s(s, 1); /* pad */          in_uint8s(s, 1);        /* pad */
656          in_uint8(s, width);          in_uint8(s, width);
657          in_uint8(s, height);          in_uint8(s, height);
658          in_uint8(s, bpp);          in_uint8(s, bpp);
659          in_uint8s(s, 2); /* bufsize */          in_uint8s(s, 2);        /* bufsize */
660          in_uint16_le(s, cache_idx);          in_uint16_le(s, cache_idx);
661          in_uint8s(s, 2); /* pad */          in_uint8s(s, 2);        /* pad */
662          in_uint16_le(s, size);          in_uint16_le(s, size);
663          in_uint8s(s, 4); /* row_size, final_size */          in_uint8s(s, 4);        /* row_size, final_size */
664          in_uint8p(s, data, size);          in_uint8p(s, data, size);
665    
666          DEBUG("BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n",          DEBUG(("BMPCACHE(cx=%d,cy=%d,id=%d,idx=%d)\n", width, height, cache_id, cache_idx));
               width, height, cache_id, cache_idx);  
667    
668          bmpdata = xmalloc(width * height);          bmpdata = xmalloc(width * height);
669    
# Line 687  static void process_bmpcache(STREAM s) Line 677  static void process_bmpcache(STREAM s)
677  }  }
678    
679  /* Process a colourmap cache order */  /* Process a colourmap cache order */
680  static void process_colcache(STREAM s)  static void
681    process_colcache(STREAM s)
682  {  {
683          COLOURENTRY *entry;          COLOURENTRY *entry;
684          COLOURMAP map;          COLOURMAP map;
# Line 706  static void process_colcache(STREAM s) Line 697  static void process_colcache(STREAM s)
697                  in_uint8(s, entry->blue);                  in_uint8(s, entry->blue);
698                  in_uint8(s, entry->green);                  in_uint8(s, entry->green);
699                  in_uint8(s, entry->red);                  in_uint8(s, entry->red);
700                  in_uint8s(s, 1); /* pad */                  in_uint8s(s, 1);        /* pad */
701          }          }
702    
703          DEBUG("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours);          DEBUG(("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours));
704    
705          hmap = ui_create_colourmap(&map);          hmap = ui_create_colourmap(&map);
706          ui_set_colourmap(hmap);          ui_set_colourmap(hmap);
# Line 718  static void process_colcache(STREAM s) Line 709  static void process_colcache(STREAM s)
709  }  }
710    
711  /* Process a font cache order */  /* Process a font cache order */
712  static void process_fontcache(STREAM s)  static void
713    process_fontcache(STREAM s)
714  {  {
715          HGLYPH bitmap;          HGLYPH bitmap;
716          uint8 font, nglyphs;          uint8 font, nglyphs;
717          uint16 character, offset, baseline, width, height;          uint16 character, offset, baseline, width, height;
718          uint8 *data, *rev_data, in, out;          int i, datasize;
719          int i, j, datasize;          uint8 *data;
720    
721          in_uint8(s, font);          in_uint8(s, font);
722          in_uint8(s, nglyphs);          in_uint8(s, nglyphs);
723    
724          DEBUG("FONTCACHE(font=%d,n=%d)\n", font, nglyphs);          DEBUG(("FONTCACHE(font=%d,n=%d)\n", font, nglyphs));
725    
726          for (i = 0; i < nglyphs; i++)          for (i = 0; i < nglyphs; i++)
727          {          {
# Line 743  static void process_fontcache(STREAM s) Line 735  static void process_fontcache(STREAM s)
735                  in_uint8p(s, data, datasize);                  in_uint8p(s, data, datasize);
736    
737                  bitmap = ui_create_glyph(width, height, data);                  bitmap = ui_create_glyph(width, height, data);
738                  cache_put_font(font, character, offset, baseline,                  cache_put_font(font, character, offset, baseline, width, height, bitmap);
                                 width, height, bitmap);  
739          }          }
740  }  }
741    
742  /* Process a secondary order */  /* Process a secondary order */
743  static void process_secondary_order(STREAM s)  static void
744    process_secondary_order(STREAM s)
745  {  {
746          uint16 length;          uint16 length;
747          uint8 type;          uint8 type;
748          uint8 *next_order;          uint8 *next_order;
749    
750          in_uint16_le(s, length);          in_uint16_le(s, length);
751          in_uint8s(s, 2); /* flags */          in_uint8s(s, 2);        /* flags */
752          in_uint8(s, type);          in_uint8(s, type);
753    
754          next_order = s->p + length + 7;          next_order = s->p + length + 7;
# Line 780  static void process_secondary_order(STRE Line 772  static void process_secondary_order(STRE
772                          break;                          break;
773    
774                  default:                  default:
775                          NOTIMP("secondary order %d\n", type);                          unimpl("secondary order %d\n", type);
776          }          }
777    
778          s->p = next_order;          s->p = next_order;
779  }  }
780    
781  /* Process an order PDU */  /* Process an order PDU */
782  void process_orders(STREAM s)  void
783    process_orders(STREAM s)
784  {  {
785          RDP_ORDER_STATE *os = &order_state;          RDP_ORDER_STATE *os = &order_state;
786          uint32 present;          uint32 present;
# Line 796  void process_orders(STREAM s) Line 789  void process_orders(STREAM s)
789          int size, processed = 0;          int size, processed = 0;
790          BOOL delta;          BOOL delta;
791    
792          in_uint8s(s, 2); /* pad */          in_uint8s(s, 2);        /* pad */
793          in_uint16_le(s, num_orders);          in_uint16_le(s, num_orders);
794          in_uint8s(s, 2); /* pad */          in_uint8s(s, 2);        /* pad */
795    
796          while (processed < num_orders)          while (processed < num_orders)
797          {          {
# Line 806  void process_orders(STREAM s) Line 799  void process_orders(STREAM s)
799    
800                  if (!(order_flags & RDP_ORDER_STANDARD))                  if (!(order_flags & RDP_ORDER_STANDARD))
801                  {                  {
802                          ERROR("order parsing failed\n");                          error("order parsing failed\n");
803                          break;                          break;
804                  }                  }
805    
# Line 846  void process_orders(STREAM s) Line 839  void process_orders(STREAM s)
839                                          rdp_parse_bounds(s, &os->bounds);                                          rdp_parse_bounds(s, &os->bounds);
840    
841                                  ui_set_clip(os->bounds.left,                                  ui_set_clip(os->bounds.left,
842                                          os->bounds.top,                                              os->bounds.top,
843                                          os->bounds.right - os->bounds.left + 1,                                              os->bounds.right -
844                                          os->bounds.bottom - os->bounds.top + 1);                                              os->bounds.left + 1,
845                                                os->bounds.bottom - os->bounds.top + 1);
846                          }                          }
847    
848                          delta = order_flags & RDP_ORDER_DELTA;                          delta = order_flags & RDP_ORDER_DELTA;
# Line 856  void process_orders(STREAM s) Line 850  void process_orders(STREAM s)
850                          switch (os->order_type)                          switch (os->order_type)
851                          {                          {
852                                  case RDP_ORDER_DESTBLT:                                  case RDP_ORDER_DESTBLT:
853                                          process_destblt(s, &os->destblt,                                          process_destblt(s, &os->destblt, present, delta);
                                                         present, delta);  
854                                          break;                                          break;
855    
856                                  case RDP_ORDER_PATBLT:                                  case RDP_ORDER_PATBLT:
857                                          process_patblt(s, &os->patblt,                                          process_patblt(s, &os->patblt, present, delta);
                                                        present, delta);  
858                                          break;                                          break;
859    
860                                  case RDP_ORDER_SCREENBLT:                                  case RDP_ORDER_SCREENBLT:
861                                          process_screenblt(s, &os->screenblt,                                          process_screenblt(s, &os->screenblt, present, delta);
                                                           present, delta);  
862                                          break;                                          break;
863    
864                                  case RDP_ORDER_LINE:                                  case RDP_ORDER_LINE:
865                                          process_line(s, &os->line,                                          process_line(s, &os->line, present, delta);
                                                         present, delta);  
866                                          break;                                          break;
867    
868                                  case RDP_ORDER_RECT:                                  case RDP_ORDER_RECT:
869                                          process_rect(s, &os->rect,                                          process_rect(s, &os->rect, present, delta);
                                                      present, delta);  
870                                          break;                                          break;
871    
872                                  case RDP_ORDER_DESKSAVE:                                  case RDP_ORDER_DESKSAVE:
873                                          process_desksave(s, &os->desksave,                                          process_desksave(s, &os->desksave, present, delta);
                                                          present, delta);  
874                                          break;                                          break;
875    
876                                  case RDP_ORDER_MEMBLT:                                  case RDP_ORDER_MEMBLT:
877                                          process_memblt(s, &os->memblt,                                          process_memblt(s, &os->memblt, present, delta);
                                                        present, delta);  
878                                          break;                                          break;
879    
880                                  case RDP_ORDER_TRIBLT:                                  case RDP_ORDER_TRIBLT:
881                                          process_triblt(s, &os->triblt,                                          process_triblt(s, &os->triblt, present, delta);
                                                        present, delta);  
882                                          break;                                          break;
883    
884                                  case RDP_ORDER_POLYLINE:                                  case RDP_ORDER_POLYLINE:
885                                          process_polyline(s, &os->polyline,                                          process_polyline(s, &os->polyline, present, delta);
                                                          present, delta);  
886                                          break;                                          break;
887    
888                                  case RDP_ORDER_TEXT2:                                  case RDP_ORDER_TEXT2:
889                                          process_text2(s, &os->text2,                                          process_text2(s, &os->text2, present, delta);
                                                       present, delta);  
890                                          break;                                          break;
891    
892                                  default:                                  default:
893                                          NOTIMP("order %d\n", os->order_type);                                          unimpl("order %d\n", os->order_type);
894                                          return;                                          return;
895                          }                          }
896    
# Line 918  void process_orders(STREAM s) Line 902  void process_orders(STREAM s)
902          }          }
903    
904          if (s->p != next_packet)          if (s->p != next_packet)
905                  WARN("%d bytes remaining\n", (int)(next_packet - s->p));                  error("%d bytes remaining\n", (int) (next_packet - s->p));
906  }  }
907    
908  /* Reset order state */  /* Reset order state */
909  void reset_order_state()  void
910    reset_order_state()
911  {  {
912          memset(&order_state, 0, sizeof(order_state));          memset(&order_state, 0, sizeof(order_state));
913            order_state.order_type = RDP_ORDER_PATBLT;
914  }  }
   

Legend:
Removed from v.23  
changed lines
  Added in v.82

  ViewVC Help
Powered by ViewVC 1.1.26