/[rdesktop]/sourceforge.net/trunk/rdesktop/bitmap.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/bitmap.c

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

revision 19 by matty, Sun Oct 8 01:59:25 2000 UTC revision 36 by matty, Sat Sep 15 14:30:46 2001 UTC
# Line 1  Line 1 
1  /*  /*
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     Bitmap decompression routines     Bitmap decompression routines
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    
23  #define CVAL(p)   (*(p++))  #define CVAL(p)   (*(p++))
 #define SVAL(p)   ((*((p++) + 1) << 8) | CVAL(p))  
24    
25  #define REPEAT(statement) { while ((count > 0) && (x < width)) { statement; count--; x++; } }  #define UNROLL8(exp) { exp exp exp exp exp exp exp exp }
 #define MASK_UPDATE() { mixmask <<= 1; if (mixmask == 0) { mask = CVAL(input); mixmask = 1; } }  
26    
27  BOOL bitmap_decompress(unsigned char *output, int width, int height,  #define REPEAT(statement) \
28                         unsigned char *input, int size)  { \
29            while((count & ~0x7) && ((x+8) < width)) \
30                    UNROLL8( statement; count--; x++; ); \
31            \
32            while((count > 0) && (x < width)) { statement; count--; x++; } \
33    }
34    
35    #define MASK_UPDATE() \
36    { \
37            mixmask <<= 1; \
38            if (mixmask == 0) \
39            { \
40                    mask = fom_mask ? fom_mask : CVAL(input); \
41                    mixmask = 1; \
42            } \
43    }
44    
45    BOOL
46    bitmap_decompress(unsigned char *output, int width, int height,
47                      unsigned char *input, int size)
48  {  {
49          unsigned char *end = input + size;          unsigned char *end = input + size;
50          unsigned char *prevline = NULL, *line = NULL;          unsigned char *prevline = NULL, *line = NULL;
# Line 35  BOOL bitmap_decompress(unsigned char *ou Line 52  BOOL bitmap_decompress(unsigned char *ou
52          int lastopcode = -1, insertmix = False, bicolour = False;          int lastopcode = -1, insertmix = False, bicolour = False;
53          uint8 code, colour1 = 0, colour2 = 0;          uint8 code, colour1 = 0, colour2 = 0;
54          uint8 mixmask, mask = 0, mix = 0xff;          uint8 mixmask, mask = 0, mix = 0xff;
55            int fom_mask = 0;
56    
57          while (input < end)          while (input < end)
58          {          {
59                    fom_mask = 0;
60                  code = CVAL(input);                  code = CVAL(input);
61                  opcode = code >> 4;                  opcode = code >> 4;
62    
# Line 54  BOOL bitmap_decompress(unsigned char *ou Line 73  BOOL bitmap_decompress(unsigned char *ou
73    
74                          case 0xf:                          case 0xf:
75                                  opcode = code & 0xf;                                  opcode = code & 0xf;
76                                  count = (opcode < 13) ? SVAL(input) : 1;                                  if (opcode < 9)
77                                    {
78                                            count = CVAL(input);
79                                            count |= CVAL(input) << 8;
80                                    }
81                                    else
82                                    {
83                                            count = (opcode < 0xb) ? 8 : 1;
84                                    }
85                                  offset = 0;                                  offset = 0;
86                                  break;                                  break;
87    
# Line 84  BOOL bitmap_decompress(unsigned char *ou Line 111  BOOL bitmap_decompress(unsigned char *ou
111                  }                  }
112    
113                  /* Read preliminary data */                  /* Read preliminary data */
                 mixmask = 0;  
114                  switch (opcode)                  switch (opcode)
115                  {                  {
116                          case 0: /* Fill */                          case 0: /* Fill */
117                                  if ((lastopcode == opcode)                                  if ((lastopcode == opcode)
118                                      && !((x == width) && (prevline == NULL)))                                      && !((x == width) && (prevline == NULL)))
119                                          insertmix = True;                                          insertmix = True;
120                                  break;                                  break;
121                          case 8: /* Bicolour */                          case 8: /* Bicolour */
122                                  colour1 = CVAL(input);                                  colour1 = CVAL(input);
123                          case 3: /* Colour */                          case 3: /* Colour */
124                                  colour2 = CVAL(input);                                  colour2 = CVAL(input);
125                                  break;                                  break;
126                          case 6: /* SetMix/Mix */                          case 6: /* SetMix/Mix */
127                          case 7: /* SetMix/FillOrMix */                          case 7: /* SetMix/FillOrMix */
128                                  mix = CVAL(input);                                  mix = CVAL(input);
129                                  opcode -= 5;                                  opcode -= 5;
130                                  break;                                  break;
131                            case 9: /* FillOrMix_1 */
132                                    mask = 0x03;
133                                    opcode = 0x02;
134                                    fom_mask = 3;
135                                    break;
136                            case 0x0a:      /* FillOrMix_2 */
137                                    mask = 0x05;
138                                    opcode = 0x02;
139                                    fom_mask = 5;
140                                    break;
141    
142                  }                  }
143    
144                  lastopcode = opcode;                  lastopcode = opcode;
145                    mixmask = 0;
146    
147                  /* Output body */                  /* Output body */
148                  while (count > 0)                  while (count > 0)
# Line 122  BOOL bitmap_decompress(unsigned char *ou Line 161  BOOL bitmap_decompress(unsigned char *ou
161    
162                          switch (opcode)                          switch (opcode)
163                          {                          {
164                                  case 0: /* Fill */                                  case 0: /* Fill */
165                                          if (insertmix)                                          if (insertmix)
166                                          {                                          {
167                                                  if (prevline == NULL)                                                  if (prevline == NULL)
168                                                          line[x] = mix;                                                          line[x] = mix;
169                                                  else                                                  else
170                                                          line[x] = prevline[x] ^ mix;                                                          line[x] =
171                                                                    prevline[x] ^
172                                                                    mix;
173    
174                                                  insertmix = False;                                                  insertmix = False;
175                                                  count--;                                                  count--;
# Line 136  BOOL bitmap_decompress(unsigned char *ou Line 177  BOOL bitmap_decompress(unsigned char *ou
177                                          }                                          }
178    
179                                          if (prevline == NULL)                                          if (prevline == NULL)
180                                                  REPEAT(line[x] = 0)                                          {
181                                                    REPEAT(line[x] = 0);
182                                            }
183                                          else                                          else
184                                                  REPEAT(line[x] = prevline[x])                                          {
185                                                    REPEAT(line[x] = prevline[x]);
186                                            }
187                                          break;                                          break;
188    
189                                  case 1: /* Mix */                                  case 1: /* Mix */
190                                          if (prevline == NULL)                                          if (prevline == NULL)
191                                                  REPEAT(line[x] = mix)                                          {
192                                                    REPEAT(line[x] = mix);
193                                            }
194                                          else                                          else
195                                                  REPEAT(line[x] = prevline[x] ^ mix)                                          {
196                                                    REPEAT(line[x] =
197                                                           prevline[x] ^ mix);
198                                            }
199                                          break;                                          break;
200    
201                                  case 2: /* Fill or Mix */                                  case 2: /* Fill or Mix */
202                                          if (prevline == NULL)                                          if (prevline == NULL)
203                                              REPEAT(                                          {
204                                                     MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
205                                                           if (mask & mixmask)
206                                                     if (mask & mixmask)                                                         line[x] = mix;
207                                                          line[x] = mix;                                                         else
208                                                     else                                                         line[x] = 0;);
209                                                          line[x] = 0;                                          }
                                             )  
210                                          else                                          else
211                                              REPEAT(                                          {
212                                                     MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
213                                                           if (mask & mixmask)
214                                                     if (mask & mixmask)                                                         line[x] =
215                                                          line[x] = prevline[x] ^ mix;                                                         prevline[x] ^ mix;
216                                                     else                                                         else
217                                                          line[x] = prevline[x];                                                         line[x] =
218                                              )                                                         prevline[x];);
219                                            }
220                                          break;                                          break;
221    
222                                  case 3: /* Colour */                                  case 3: /* Colour */
223                                          REPEAT(line[x] = colour2)                                          REPEAT(line[x] = colour2);
224                                          break;                                          break;
225    
226                                  case 4: /* Copy */                                  case 4: /* Copy */
227                                          REPEAT(line[x] = CVAL(input))                                          REPEAT(line[x] = CVAL(input));
228                                          break;                                          break;
229    
230                                  case 8: /* Bicolour */                                  case 8: /* Bicolour */
231                                          REPEAT(                                          REPEAT(if (bicolour)
232                                                  if (bicolour)                                                 {
233                                                  {                                                 line[x] = colour2;
234                                                          line[x] = colour2;                                                 bicolour = False;}
235                                                          bicolour = False;                                                 else
236                                                  }                                                 {
237                                                  else                                                 line[x] = colour1;
238                                                  {                                                 bicolour = True; count++;}
239                                                          line[x] = colour1;                                          );
                                                         bicolour = True;  
                                                         count++;  
                                                 }  
                                         )  
240                                          break;                                          break;
241    
242                                  case 13: /* White */                                  case 0xd:       /* White */
243                                          REPEAT(line[x] = 0xff)                                          REPEAT(line[x] = 0xff);
244                                          break;                                          break;
245    
246                                  case 14: /* Black */                                  case 0xe:       /* Black */
247                                          REPEAT(line[x] = 0x00)                                          REPEAT(line[x] = 0x00);
248                                          break;                                          break;
249    
250                                  default:                                  default:
251                                          NOTIMP("bitmap opcode 0x%x\n", opcode);                                          unimpl("bitmap opcode 0x%x\n",
252                                                   opcode);
253                                          return False;                                          return False;
254                          }                          }
255                  }                  }

Legend:
Removed from v.19  
changed lines
  Added in v.36

  ViewVC Help
Powered by ViewVC 1.1.26