/[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 25 by matty, Sat Jan 6 03:47:04 2001 UTC revision 314 by jsorg71, Fri Feb 7 23:43:37 2003 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-2002
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  static void
29  rdp_in_present(STREAM s, uint32 *present, uint8 flags, int size)  rdp_in_present(STREAM s, uint32 * present, uint8 flags, int size)
30  {  {
31          uint8 bits;          uint8 bits;
32          int i;          int i;
# Line 54  rdp_in_present(STREAM s, uint32 *present Line 54  rdp_in_present(STREAM s, uint32 *present
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  static void
57  rdp_in_coord(STREAM s, uint16 *coord, BOOL delta)  rdp_in_coord(STREAM s, uint16 * coord, BOOL delta)
58  {  {
59          uint8 change;          sint8 change;
60    
61          if (delta)          if (delta)
62          {          {
63                  in_uint8(s, change);                  in_uint8(s, change);
64                  *coord += (char) change;                  *coord += change;
65          }          }
66          else          else
67          {          {
# Line 71  rdp_in_coord(STREAM s, uint16 *coord, BO Line 71  rdp_in_coord(STREAM s, uint16 *coord, BO
71    
72  /* Read a colour entry */  /* Read a colour entry */
73  static void  static void
74  rdp_in_colour(STREAM s, uint8 *colour)  rdp_in_colour(STREAM s, uint32 * colour)
75  {  {
76          in_uint8(s, *colour);          uint32 i;
77          s->p += 2;          in_uint8(s, i);
78            *colour = i;
79            in_uint8(s, i);
80            *colour |= i << 8;
81            in_uint8(s, i);
82            *colour |= i << 16;
83  }  }
84    
85  /* Parse bounds information */  /* Parse bounds information */
86  static BOOL  static BOOL
87  rdp_parse_bounds(STREAM s, BOUNDS *bounds)  rdp_parse_bounds(STREAM s, BOUNDS * bounds)
88  {  {
89          uint8 present;          uint8 present;
90    
# Line 110  rdp_parse_bounds(STREAM s, BOUNDS *bound Line 115  rdp_parse_bounds(STREAM s, BOUNDS *bound
115    
116  /* Parse a pen */  /* Parse a pen */
117  static BOOL  static BOOL
118  rdp_parse_pen(STREAM s, PEN *pen, uint32 present)  rdp_parse_pen(STREAM s, PEN * pen, uint32 present)
119  {  {
120          if (present & 1)          if (present & 1)
121                  in_uint8(s, pen->style);                  in_uint8(s, pen->style);
# Line 126  rdp_parse_pen(STREAM s, PEN *pen, uint32 Line 131  rdp_parse_pen(STREAM s, PEN *pen, uint32
131    
132  /* Parse a brush */  /* Parse a brush */
133  static BOOL  static BOOL
134  rdp_parse_brush(STREAM s, BRUSH *brush, uint32 present)  rdp_parse_brush(STREAM s, BRUSH * brush, uint32 present)
135  {  {
136          if (present & 1)          if (present & 1)
137                  in_uint8(s, brush->xorigin);                  in_uint8(s, brush->xorigin);
# Line 148  rdp_parse_brush(STREAM s, BRUSH *brush, Line 153  rdp_parse_brush(STREAM s, BRUSH *brush,
153    
154  /* Process a destination blt order */  /* Process a destination blt order */
155  static void  static void
156  process_destblt(STREAM s, DESTBLT_ORDER *os, uint32 present, BOOL delta)  process_destblt(STREAM s, DESTBLT_ORDER * os, uint32 present, BOOL delta)
157  {  {
158          if (present & 0x01)          if (present & 0x01)
159                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 165  process_destblt(STREAM s, DESTBLT_ORDER Line 170  process_destblt(STREAM s, DESTBLT_ORDER
170          if (present & 0x10)          if (present & 0x10)
171                  in_uint8(s, os->opcode);                  in_uint8(s, os->opcode);
172    
173          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",
174                os->opcode, os->x, os->y, os->cx, os->cy);                 os->opcode, os->x, os->y, os->cx, os->cy));
175    
176          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);
177  }  }
178    
179  /* Process a pattern blt order */  /* Process a pattern blt order */
180  static void  static void
181  process_patblt(STREAM s, PATBLT_ORDER *os, uint32 present, BOOL delta)  process_patblt(STREAM s, PATBLT_ORDER * os, uint32 present, BOOL delta)
182  {  {
183          if (present & 0x0001)          if (present & 0x0001)
184                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 198  process_patblt(STREAM s, PATBLT_ORDER *o Line 203  process_patblt(STREAM s, PATBLT_ORDER *o
203    
204          rdp_parse_brush(s, &os->brush, present >> 7);          rdp_parse_brush(s, &os->brush, present >> 7);
205    
206          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,
207                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);  
208    
209          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,
210                    &os->brush, os->bgcolour, os->fgcolour);                    &os->brush, os->bgcolour, os->fgcolour);
# Line 208  process_patblt(STREAM s, PATBLT_ORDER *o Line 212  process_patblt(STREAM s, PATBLT_ORDER *o
212    
213  /* Process a screen blt order */  /* Process a screen blt order */
214  static void  static void
215  process_screenblt(STREAM s, SCREENBLT_ORDER *os, uint32 present, BOOL delta)  process_screenblt(STREAM s, SCREENBLT_ORDER * os, uint32 present, BOOL delta)
216  {  {
217          if (present & 0x0001)          if (present & 0x0001)
218                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 231  process_screenblt(STREAM s, SCREENBLT_OR Line 235  process_screenblt(STREAM s, SCREENBLT_OR
235          if (present & 0x0040)          if (present & 0x0040)
236                  rdp_in_coord(s, &os->srcy, delta);                  rdp_in_coord(s, &os->srcy, delta);
237    
238          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",
239                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));
240    
241          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);  
242  }  }
243    
244  /* Process a line order */  /* Process a line order */
245  static void  static void
246  process_line(STREAM s, LINE_ORDER *os, uint32 present, BOOL delta)  process_line(STREAM s, LINE_ORDER * os, uint32 present, BOOL delta)
247  {  {
248          if (present & 0x0001)          if (present & 0x0001)
249                  in_uint16_le(s, os->mixmode);                  in_uint16_le(s, os->mixmode);
# Line 265  process_line(STREAM s, LINE_ORDER *os, u Line 268  process_line(STREAM s, LINE_ORDER *os, u
268    
269          rdp_parse_pen(s, &os->pen, present >> 7);          rdp_parse_pen(s, &os->pen, present >> 7);
270    
271          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",
272                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);  
273    
274          if (os->opcode < 0x01 || os->opcode > 0x10)          if (os->opcode < 0x01 || os->opcode > 0x10)
275          {          {
276                  ERROR("bad ROP2 0x%x\n", os->opcode);                  error("bad ROP2 0x%x\n", os->opcode);
277                  return;                  return;
278          }          }
279    
280          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);  
281  }  }
282    
283  /* Process an opaque rectangle order */  /* Process an opaque rectangle order */
284  static void  static void
285  process_rect(STREAM s, RECT_ORDER *os, uint32 present, BOOL delta)  process_rect(STREAM s, RECT_ORDER * os, uint32 present, BOOL delta)
286  {  {
287            uint32 i;
288          if (present & 0x01)          if (present & 0x01)
289                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
290    
# Line 296  process_rect(STREAM s, RECT_ORDER *os, u Line 298  process_rect(STREAM s, RECT_ORDER *os, u
298                  rdp_in_coord(s, &os->cy, delta);                  rdp_in_coord(s, &os->cy, delta);
299    
300          if (present & 0x10)          if (present & 0x10)
301                  in_uint8(s, os->colour);          {
302                    in_uint8(s, i);
303                    os->colour = (os->colour & 0xffffff00) | i;
304            }
305    
306            if (present & 0x20)
307            {
308                    in_uint8(s, i);
309                    os->colour = (os->colour & 0xffff00ff) | (i << 8);
310            }
311    
312            if (present & 0x40)
313            {
314                    in_uint8(s, i);
315                    os->colour = (os->colour & 0xff00ffff) | (i << 16);
316            }
317    
318          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);  
319    
320          ui_rect(os->x, os->y, os->cx, os->cy, os->colour);          ui_rect(os->x, os->y, os->cx, os->cy, os->colour);
321  }  }
322    
323  /* Process a desktop save order */  /* Process a desktop save order */
324  static void  static void
325  process_desksave(STREAM s, DESKSAVE_ORDER *os, uint32 present, BOOL delta)  process_desksave(STREAM s, DESKSAVE_ORDER * os, uint32 present, BOOL delta)
326  {  {
327          int width, height;          int width, height;
328    
# Line 328  process_desksave(STREAM s, DESKSAVE_ORDE Line 344  process_desksave(STREAM s, DESKSAVE_ORDE
344          if (present & 0x20)          if (present & 0x20)
345                  in_uint8(s, os->action);                  in_uint8(s, os->action);
346    
347          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",
348                os->left, os->top, os->right, os->bottom, os->offset,                 os->left, os->top, os->right, os->bottom, os->offset, os->action));
               os->action);  
349    
350          width = os->right - os->left + 1;          width = os->right - os->left + 1;
351          height = os->bottom - os->top + 1;          height = os->bottom - os->top + 1;
# Line 338  process_desksave(STREAM s, DESKSAVE_ORDE Line 353  process_desksave(STREAM s, DESKSAVE_ORDE
353          if (os->action == 0)          if (os->action == 0)
354                  ui_desktop_save(os->offset, os->left, os->top, width, height);                  ui_desktop_save(os->offset, os->left, os->top, width, height);
355          else          else
356                  ui_desktop_restore(os->offset, os->left, os->top, width,                  ui_desktop_restore(os->offset, os->left, os->top, width, height);
                                    height);  
357  }  }
358    
359  /* Process a memory blt order */  /* Process a memory blt order */
360  static void  static void
361  process_memblt(STREAM s, MEMBLT_ORDER *os, uint32 present, BOOL delta)  process_memblt(STREAM s, MEMBLT_ORDER * os, uint32 present, BOOL delta)
362  {  {
363          HBITMAP bitmap;          HBITMAP bitmap;
364    
# Line 378  process_memblt(STREAM s, MEMBLT_ORDER *o Line 392  process_memblt(STREAM s, MEMBLT_ORDER *o
392          if (present & 0x0100)          if (present & 0x0100)
393                  in_uint16_le(s, os->cache_idx);                  in_uint16_le(s, os->cache_idx);
394    
395          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",
396                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);  
397    
398          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
399          if (bitmap == NULL)          if (bitmap == NULL)
400                  return;                  return;
401    
402          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);  
403  }  }
404    
405  /* Process a 3-way blt order */  /* Process a 3-way blt order */
406  static void  static void
407  process_triblt(STREAM s, TRIBLT_ORDER *os, uint32 present, BOOL delta)  process_triblt(STREAM s, TRIBLT_ORDER * os, uint32 present, BOOL delta)
408  {  {
409          HBITMAP bitmap;          HBITMAP bitmap;
410    
# Line 437  process_triblt(STREAM s, TRIBLT_ORDER *o Line 449  process_triblt(STREAM s, TRIBLT_ORDER *o
449          if (present & 0x010000)          if (present & 0x010000)
450                  in_uint16_le(s, os->unknown);                  in_uint16_le(s, os->unknown);
451    
452          DEBUG          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",
453                  ("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",                 os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id, os->cache_idx,
454                   os->opcode, os->x, os->y, os->cx, os->cy, os->cache_id,                 os->brush.style, os->bgcolour, os->fgcolour));
                  os->cache_idx, os->brush.style, os->bgcolour, os->fgcolour);  
455    
456          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);          bitmap = cache_get_bitmap(os->cache_id, os->cache_idx);
457          if (bitmap == NULL)          if (bitmap == NULL)
458                  return;                  return;
459    
460          ui_triblt(os->opcode, os->x, os->y, os->cx, os->cy,          ui_triblt(os->opcode, os->x, os->y, os->cx, os->cy,
461                    bitmap, os->srcx, os->srcy,                    bitmap, os->srcx, os->srcy, &os->brush, os->bgcolour, os->fgcolour);
                   &os->brush, os->bgcolour, os->fgcolour);  
462  }  }
463    
464  /* Parse a delta co-ordinate in polyline order form */  /* Parse a delta co-ordinate in polyline order form */
465  static int  static int
466  parse_delta(uint8 *buffer, int *offset)  parse_delta(uint8 * buffer, int *offset)
467  {  {
468          int value = buffer[(*offset)++];          int value = buffer[(*offset)++];
469          int two_byte = value & 0x80;          int two_byte = value & 0x80;
# Line 471  parse_delta(uint8 *buffer, int *offset) Line 481  parse_delta(uint8 *buffer, int *offset)
481    
482  /* Process a polyline order */  /* Process a polyline order */
483  static void  static void
484  process_polyline(STREAM s, POLYLINE_ORDER *os, uint32 present, BOOL delta)  process_polyline(STREAM s, POLYLINE_ORDER * os, uint32 present, BOOL delta)
485  {  {
486          int index, line, data;          int index, line, data;
487          int x, y, xfrom, yfrom;          int x, y, xfrom, yfrom;
488          uint8 flags = 0;          uint8 flags = 0;
489          PEN pen;          PEN pen;
490            uint8 opcode;
491    
492          if (present & 0x01)          if (present & 0x01)
493                  rdp_in_coord(s, &os->x, delta);                  rdp_in_coord(s, &os->x, delta);
# Line 485  process_polyline(STREAM s, POLYLINE_ORDE Line 496  process_polyline(STREAM s, POLYLINE_ORDE
496                  rdp_in_coord(s, &os->y, delta);                  rdp_in_coord(s, &os->y, delta);
497    
498          if (present & 0x04)          if (present & 0x04)
499                  in_uint8(s, os->flags);                  in_uint8(s, os->opcode);
500    
501          if (present & 0x10)          if (present & 0x10)
502                  rdp_in_colour(s, &os->fgcolour);                  rdp_in_colour(s, &os->fgcolour);
# Line 499  process_polyline(STREAM s, POLYLINE_ORDE Line 510  process_polyline(STREAM s, POLYLINE_ORDE
510                  in_uint8a(s, os->data, os->datasize);                  in_uint8a(s, os->data, os->datasize);
511          }          }
512    
513          DEBUG("POLYLINE(x=%d,y=%d,fl=0x%x,fg=0x%x,n=%d,sz=%d)\n",          DEBUG(("POLYLINE(x=%d,y=%d,op=0x%x,fg=0x%x,n=%d,sz=%d)\n",
514                os->x, os->y, os->flags, os->fgcolour, os->lines, os->datasize);                 os->x, os->y, os->opcode, os->fgcolour, os->lines, os->datasize));
515    
516          DEBUG("Data: ");          DEBUG(("Data: "));
517    
518          for (index = 0; index < os->datasize; index++)          for (index = 0; index < os->datasize; index++)
519                  DEBUG("%02x ", os->data[index]);                  DEBUG(("%02x ", os->data[index]));
520    
521            DEBUG(("\n"));
522    
523          DEBUG("\n");          if (os->opcode < 0x01 || os->opcode > 0x10)
524            {
525                    error("bad ROP2 0x%x\n", os->opcode);
526                    return;
527            }
528    
529            opcode = os->opcode - 1;
530          x = os->x;          x = os->x;
531          y = os->y;          y = os->y;
532          pen.style = pen.width = 0;          pen.style = pen.width = 0;
# Line 533  process_polyline(STREAM s, POLYLINE_ORDE Line 551  process_polyline(STREAM s, POLYLINE_ORDE
551                  if (flags & 0x80)                  if (flags & 0x80)
552                          y += parse_delta(os->data, &data);                          y += parse_delta(os->data, &data);
553    
554                  ui_line(ROP2_COPY, xfrom, yfrom, x, y, &pen);                  ui_line(opcode, xfrom, yfrom, x, y, &pen);
555    
556                  flags <<= 2;                  flags <<= 2;
557          }          }
# Line 541  process_polyline(STREAM s, POLYLINE_ORDE Line 559  process_polyline(STREAM s, POLYLINE_ORDE
559    
560  /* Process a text order */  /* Process a text order */
561  static void  static void
562  process_text2(STREAM s, TEXT2_ORDER *os, uint32 present, BOOL delta)  process_text2(STREAM s, TEXT2_ORDER * os, uint32 present, BOOL delta)
563  {  {
         DATABLOB *entry;  
564          int i;          int i;
565    
566          if (present & 0x000001)          if (present & 0x000001)
# Line 600  process_text2(STREAM s, TEXT2_ORDER *os, Line 617  process_text2(STREAM s, TEXT2_ORDER *os,
617                  in_uint8a(s, os->text, os->length);                  in_uint8a(s, os->text, os->length);
618          }          }
619    
620          DEBUG          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));
                 ("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);  
621    
622          DEBUG("Text: ");          DEBUG(("Text: "));
623    
624          for (i = 0; i < os->length; i++)          for (i = 0; i < os->length; i++)
625                  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]);  
626    
627                  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);  
         }  
628    
629          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,
630                       os->clipleft, os->cliptop,                       os->clipleft, os->cliptop,
# Line 638  process_text2(STREAM s, TEXT2_ORDER *os, Line 632  process_text2(STREAM s, TEXT2_ORDER *os,
632                       os->clipbottom - os->cliptop,                       os->clipbottom - os->cliptop,
633                       os->boxleft, os->boxtop,                       os->boxleft, os->boxtop,
634                       os->boxright - os->boxleft,                       os->boxright - os->boxleft,
635                       os->boxbottom - os->boxtop,                       os->boxbottom - os->boxtop, os->bgcolour, os->fgcolour, os->text, os->length);
                      os->bgcolour, os->fgcolour, os->text, os->length);  
636  }  }
637    
638  /* Process a raw bitmap cache order */  /* Process a raw bitmap cache order */
# Line 648  process_raw_bmpcache(STREAM s) Line 641  process_raw_bmpcache(STREAM s)
641  {  {
642          HBITMAP bitmap;          HBITMAP bitmap;
643          uint16 cache_idx, bufsize;          uint16 cache_idx, bufsize;
644          uint8 cache_id, width, height, bpp;          uint8 cache_id, width, height, bpp, Bpp;
645          uint8 *data;          uint8 *data, *inverted;
646            int y;
647    
648          in_uint8(s, cache_id);          in_uint8(s, cache_id);
649          in_uint8s(s, 1);        /* pad */          in_uint8s(s, 1);        /* pad */
650          in_uint8(s, width);          in_uint8(s, width);
651          in_uint8(s, height);          in_uint8(s, height);
652          in_uint8(s, bpp);          in_uint8(s, bpp);
653            Bpp = (bpp + 7) / 8;
654          in_uint16_le(s, bufsize);          in_uint16_le(s, bufsize);
655          in_uint16_le(s, cache_idx);          in_uint16_le(s, cache_idx);
656          in_uint8p(s, data, bufsize);          in_uint8p(s, data, bufsize);
657    
658          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));
659                width, height, cache_id, cache_idx);          inverted = xmalloc(width * height * Bpp);
660            for (y = 0; y < height; y++)
661            {
662                    memcpy(&inverted[(height - y - 1) * (width * Bpp)], &data[y * (width * Bpp)], width * Bpp);
663            }
664    
665          bitmap = ui_create_bitmap(width, height, data);          bitmap = ui_create_bitmap(width, height, inverted);
666            xfree(inverted);
667          cache_put_bitmap(cache_id, cache_idx, bitmap);          cache_put_bitmap(cache_id, cache_idx, bitmap);
668  }  }
669    
# Line 673  process_bmpcache(STREAM s) Line 673  process_bmpcache(STREAM s)
673  {  {
674          HBITMAP bitmap;          HBITMAP bitmap;
675          uint16 cache_idx, size;          uint16 cache_idx, size;
676          uint8 cache_id, width, height, bpp;          uint8 cache_id, width, height, bpp, Bpp;
677          uint8 *data, *bmpdata;          uint8 *data, *bmpdata;
678    
679          in_uint8(s, cache_id);          in_uint8(s, cache_id);
# Line 681  process_bmpcache(STREAM s) Line 681  process_bmpcache(STREAM s)
681          in_uint8(s, width);          in_uint8(s, width);
682          in_uint8(s, height);          in_uint8(s, height);
683          in_uint8(s, bpp);          in_uint8(s, bpp);
684            Bpp = (bpp + 7) / 8;
685          in_uint8s(s, 2);        /* bufsize */          in_uint8s(s, 2);        /* bufsize */
686          in_uint16_le(s, cache_idx);          in_uint16_le(s, cache_idx);
687          in_uint8s(s, 2);        /* pad */          in_uint8s(s, 2);        /* pad */
# Line 688  process_bmpcache(STREAM s) Line 689  process_bmpcache(STREAM s)
689          in_uint8s(s, 4);        /* row_size, final_size */          in_uint8s(s, 4);        /* row_size, final_size */
690          in_uint8p(s, data, size);          in_uint8p(s, data, size);
691    
692          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);  
693    
694          bmpdata = xmalloc(width * height);          bmpdata = xmalloc(width * height * Bpp);
695    
696          if (bitmap_decompress(bmpdata, width, height, data, size))          if (bitmap_decompress(bmpdata, width, height, data, size, Bpp))
697          {          {
698                  bitmap = ui_create_bitmap(width, height, bmpdata);                  bitmap = ui_create_bitmap(width, height, bmpdata);
699                  cache_put_bitmap(cache_id, cache_idx, bitmap);                  cache_put_bitmap(cache_id, cache_idx, bitmap);
# Line 726  process_colcache(STREAM s) Line 726  process_colcache(STREAM s)
726                  in_uint8s(s, 1);        /* pad */                  in_uint8s(s, 1);        /* pad */
727          }          }
728    
729          DEBUG("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours);          DEBUG(("COLCACHE(id=%d,n=%d)\n", cache_id, map.ncolours));
730    
731          hmap = ui_create_colourmap(&map);          hmap = ui_create_colourmap(&map);
732          ui_set_colourmap(hmap);          ui_set_colourmap(hmap);
# Line 747  process_fontcache(STREAM s) Line 747  process_fontcache(STREAM s)
747          in_uint8(s, font);          in_uint8(s, font);
748          in_uint8(s, nglyphs);          in_uint8(s, nglyphs);
749    
750          DEBUG("FONTCACHE(font=%d,n=%d)\n", font, nglyphs);          DEBUG(("FONTCACHE(font=%d,n=%d)\n", font, nglyphs));
751    
752          for (i = 0; i < nglyphs; i++)          for (i = 0; i < nglyphs; i++)
753          {          {
# Line 761  process_fontcache(STREAM s) Line 761  process_fontcache(STREAM s)
761                  in_uint8p(s, data, datasize);                  in_uint8p(s, data, datasize);
762    
763                  bitmap = ui_create_glyph(width, height, data);                  bitmap = ui_create_glyph(width, height, data);
764                  cache_put_font(font, character, offset, baseline,                  cache_put_font(font, character, offset, baseline, width, height, bitmap);
                                width, height, bitmap);  
765          }          }
766  }  }
767    
# Line 799  process_secondary_order(STREAM s) Line 798  process_secondary_order(STREAM s)
798                          break;                          break;
799    
800                  default:                  default:
801                          NOTIMP("secondary order %d\n", type);                          unimpl("secondary order %d\n", type);
802          }          }
803    
804          s->p = next_order;          s->p = next_order;
# Line 826  process_orders(STREAM s) Line 825  process_orders(STREAM s)
825    
826                  if (!(order_flags & RDP_ORDER_STANDARD))                  if (!(order_flags & RDP_ORDER_STANDARD))
827                  {                  {
828                          ERROR("order parsing failed\n");                          error("order parsing failed\n");
829                          break;                          break;
830                  }                  }
831    
# Line 869  process_orders(STREAM s) Line 868  process_orders(STREAM s)
868                                              os->bounds.top,                                              os->bounds.top,
869                                              os->bounds.right -                                              os->bounds.right -
870                                              os->bounds.left + 1,                                              os->bounds.left + 1,
871                                              os->bounds.bottom -                                              os->bounds.bottom - os->bounds.top + 1);
                                             os->bounds.top + 1);  
872                          }                          }
873    
874                          delta = order_flags & RDP_ORDER_DELTA;                          delta = order_flags & RDP_ORDER_DELTA;
# Line 878  process_orders(STREAM s) Line 876  process_orders(STREAM s)
876                          switch (os->order_type)                          switch (os->order_type)
877                          {                          {
878                                  case RDP_ORDER_DESTBLT:                                  case RDP_ORDER_DESTBLT:
879                                          process_destblt(s, &os->destblt,                                          process_destblt(s, &os->destblt, present, delta);
                                                         present, delta);  
880                                          break;                                          break;
881    
882                                  case RDP_ORDER_PATBLT:                                  case RDP_ORDER_PATBLT:
883                                          process_patblt(s, &os->patblt,                                          process_patblt(s, &os->patblt, present, delta);
                                                        present, delta);  
884                                          break;                                          break;
885    
886                                  case RDP_ORDER_SCREENBLT:                                  case RDP_ORDER_SCREENBLT:
887                                          process_screenblt(s, &os->screenblt,                                          process_screenblt(s, &os->screenblt, present, delta);
                                                           present, delta);  
888                                          break;                                          break;
889    
890                                  case RDP_ORDER_LINE:                                  case RDP_ORDER_LINE:
891                                          process_line(s, &os->line,                                          process_line(s, &os->line, present, delta);
                                                      present, delta);  
892                                          break;                                          break;
893    
894                                  case RDP_ORDER_RECT:                                  case RDP_ORDER_RECT:
895                                          process_rect(s, &os->rect,                                          process_rect(s, &os->rect, present, delta);
                                                      present, delta);  
896                                          break;                                          break;
897    
898                                  case RDP_ORDER_DESKSAVE:                                  case RDP_ORDER_DESKSAVE:
899                                          process_desksave(s, &os->desksave,                                          process_desksave(s, &os->desksave, present, delta);
                                                          present, delta);  
900                                          break;                                          break;
901    
902                                  case RDP_ORDER_MEMBLT:                                  case RDP_ORDER_MEMBLT:
903                                          process_memblt(s, &os->memblt,                                          process_memblt(s, &os->memblt, present, delta);
                                                        present, delta);  
904                                          break;                                          break;
905    
906                                  case RDP_ORDER_TRIBLT:                                  case RDP_ORDER_TRIBLT:
907                                          process_triblt(s, &os->triblt,                                          process_triblt(s, &os->triblt, present, delta);
                                                        present, delta);  
908                                          break;                                          break;
909    
910                                  case RDP_ORDER_POLYLINE:                                  case RDP_ORDER_POLYLINE:
911                                          process_polyline(s, &os->polyline,                                          process_polyline(s, &os->polyline, present, delta);
                                                          present, delta);  
912                                          break;                                          break;
913    
914                                  case RDP_ORDER_TEXT2:                                  case RDP_ORDER_TEXT2:
915                                          process_text2(s, &os->text2,                                          process_text2(s, &os->text2, present, delta);
                                                       present, delta);  
916                                          break;                                          break;
917    
918                                  default:                                  default:
919                                          NOTIMP("order %d\n", os->order_type);                                          unimpl("order %d\n", os->order_type);
920                                          return;                                          return;
921                          }                          }
922    
# Line 940  process_orders(STREAM s) Line 928  process_orders(STREAM s)
928          }          }
929    
930          if (s->p != next_packet)          if (s->p != next_packet)
931                  WARN("%d bytes remaining\n", (int) (next_packet - s->p));                  error("%d bytes remaining\n", (int) (next_packet - s->p));
932  }  }
933    
934  /* Reset order state */  /* Reset order state */
935  void  void
936  reset_order_state()  reset_order_state(void)
937  {  {
938          memset(&order_state, 0, sizeof(order_state));          memset(&order_state, 0, sizeof(order_state));
939            order_state.order_type = RDP_ORDER_PATBLT;
940  }  }

Legend:
Removed from v.25  
changed lines
  Added in v.314

  ViewVC Help
Powered by ViewVC 1.1.26