/[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 207 by matthewc, Thu Sep 26 14:26:46 2002 UTC revision 314 by jsorg71, Fri Feb 7 23:43:37 2003 UTC
# Line 2  Line 2 
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-2002     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
8     the Free Software Foundation; either version 2 of the License, or     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.     (at your option) any later version.
10      
11     This program is distributed in the hope that it will be useful,     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.     GNU General Public License for more details.
15      
16     You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# Line 22  Line 22 
22    
23  #define CVAL(p)   (*(p++))  #define CVAL(p)   (*(p++))
24    
25    uint32 cvalx(unsigned char **input, int Bpp)
26    {
27            uint32 rv = 0;
28            memcpy(&rv, *input, Bpp);
29            *input += Bpp;
30            return rv;
31    }
32    
33    void setli(unsigned char * input, int offset, uint32 value, int Bpp)
34    {
35            input += offset * Bpp;
36            memcpy(input, &value, Bpp);
37    }
38    
39    uint32 getli(unsigned char * input, int offset, int Bpp)
40    {
41            uint32 rv = 0;
42            input += offset * Bpp;
43            memcpy(&rv, input, Bpp);
44            return rv;
45    }
46    
47  #define UNROLL8(exp) { exp exp exp exp exp exp exp exp }  #define UNROLL8(exp) { exp exp exp exp exp exp exp exp }
48    
49  #define REPEAT(statement) \  #define REPEAT(statement) \
# Line 43  Line 65 
65  }  }
66    
67  BOOL  BOOL
68  bitmap_decompress(unsigned char *output, int width, int height, unsigned char *input, int size)  bitmap_decompress(unsigned char *output, int width, int height, unsigned char *input, int size, int Bpp)
69  {  {
70          unsigned char *end = input + size;          unsigned char *end = input + size;
71          unsigned char *prevline = NULL, *line = NULL;          unsigned char *prevline = NULL, *line = NULL;
72          int opcode, count, offset, isfillormix, x = width;          int opcode, count, offset, isfillormix, x = width;
73          int lastopcode = -1, insertmix = False, bicolour = False;          int lastopcode = -1, insertmix = False, bicolour = False;
74          uint8 code, colour1 = 0, colour2 = 0;          uint8 code;
75          uint8 mixmask, mask = 0, mix = 0xff;          uint32 colour1 = 0, colour2 = 0;
76            uint8 mixmask, mask = 0;
77            uint32 mix = 0xffffffff;
78          int fom_mask = 0;          int fom_mask = 0;
79    
80          while (input < end)          while (input < end)
# Line 117  bitmap_decompress(unsigned char *output, Line 141  bitmap_decompress(unsigned char *output,
141                                          insertmix = True;                                          insertmix = True;
142                                  break;                                  break;
143                          case 8: /* Bicolour */                          case 8: /* Bicolour */
144                                  colour1 = CVAL(input);                                  colour1 = cvalx(&input, Bpp);
145                          case 3: /* Colour */                          case 3: /* Colour */
146                                  colour2 = CVAL(input);                                  colour2 = cvalx(&input, Bpp);
147                                  break;                                  break;
148                          case 6: /* SetMix/Mix */                          case 6: /* SetMix/Mix */
149                          case 7: /* SetMix/FillOrMix */                          case 7: /* SetMix/FillOrMix */
150                                  mix = CVAL(input);                                  mix = cvalx(&input, Bpp);
151                                  opcode -= 5;                                  opcode -= 5;
152                                  break;                                  break;
153                          case 9: /* FillOrMix_1 */                          case 9: /* FillOrMix_1 */
# Line 154  bitmap_decompress(unsigned char *output, Line 178  bitmap_decompress(unsigned char *output,
178                                  height--;                                  height--;
179    
180                                  prevline = line;                                  prevline = line;
181                                  line = output + height * width;                                  line = output + height * width * Bpp;
182                          }                          }
183    
184                          switch (opcode)                          switch (opcode)
# Line 163  bitmap_decompress(unsigned char *output, Line 187  bitmap_decompress(unsigned char *output,
187                                          if (insertmix)                                          if (insertmix)
188                                          {                                          {
189                                                  if (prevline == NULL)                                                  if (prevline == NULL)
190                                                          line[x] = mix;                                                          setli(line, x, mix, Bpp);
191                                                  else                                                  else
192                                                          line[x] = prevline[x] ^ mix;                                                          setli(line, x, getli(prevline, x, Bpp) ^ mix, Bpp);
193    
194                                                  insertmix = False;                                                  insertmix = False;
195                                                  count--;                                                  count--;
# Line 174  bitmap_decompress(unsigned char *output, Line 198  bitmap_decompress(unsigned char *output,
198    
199                                          if (prevline == NULL)                                          if (prevline == NULL)
200                                          {                                          {
201                                                  REPEAT(line[x] = 0);                                                  REPEAT(setli(line, x, 0, Bpp))
202                                          }                                          }
203                                          else                                          else
204                                          {                                          {
205                                                  REPEAT(line[x] = prevline[x]);                                                  REPEAT(setli(line, x, getli(prevline, x, Bpp), Bpp));
206                                          }                                          }
207                                          break;                                          break;
208    
209                                  case 1: /* Mix */                                  case 1: /* Mix */
210                                          if (prevline == NULL)                                          if (prevline == NULL)
211                                          {                                          {
212                                                  REPEAT(line[x] = mix);                                                  REPEAT(setli(line, x, mix, Bpp));
213                                          }                                          }
214                                          else                                          else
215                                          {                                          {
216                                                  REPEAT(line[x] = prevline[x] ^ mix);                                                  REPEAT(setli(line, x, getli(prevline, x, Bpp) ^ mix, Bpp));
217                                          }                                          }
218                                          break;                                          break;
219    
# Line 197  bitmap_decompress(unsigned char *output, Line 221  bitmap_decompress(unsigned char *output,
221                                          if (prevline == NULL)                                          if (prevline == NULL)
222                                          {                                          {
223                                                  REPEAT(MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
224                                                         if (mask & mixmask) line[x] = mix;                                                         if (mask & mixmask) setli(line, x, mix, Bpp);
225                                                         else                                                         else
226                                                         line[x] = 0;);                                                         setli(line, x, 0, Bpp););
227                                          }                                          }
228                                          else                                          else
229                                          {                                          {
230                                                  REPEAT(MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
231                                                         if (mask & mixmask)                                                         if (mask & mixmask)
232                                                         line[x] = prevline[x] ^ mix;                                                         setli(line, x, getli(prevline, x, Bpp) ^ mix, Bpp);
233                                                         else                                                         else
234                                                         line[x] = prevline[x];);                                                         setli(line, x, getli(prevline, x, Bpp), Bpp););
235                                          }                                          }
236                                          break;                                          break;
237    
238                                  case 3: /* Colour */                                  case 3: /* Colour */
239                                          REPEAT(line[x] = colour2);                                          REPEAT(setli(line, x, colour2, Bpp));
240                                          break;                                          break;
241    
242                                  case 4: /* Copy */                                  case 4: /* Copy */
243                                          REPEAT(line[x] = CVAL(input));                                          REPEAT(setli(line, x, cvalx(&input, Bpp), Bpp));
244                                          break;                                          break;
245    
246                                  case 8: /* Bicolour */                                  case 8: /* Bicolour */
247                                          REPEAT(if (bicolour)                                          REPEAT(if (bicolour)
248                                                 {                                                 {
249                                                 line[x] = colour2; bicolour = False;}                                                 setli(line, x, colour2, Bpp); bicolour = False;}
250                                                 else                                                 else
251                                                 {                                                 {
252                                                 line[x] = colour1; bicolour = True; count++;}                                                 setli(line, x, colour1, Bpp); bicolour = True; count++;}
253                                          );                                          );
254                                          break;                                          break;
255    
256                                  case 0xd:       /* White */                                  case 0xd:       /* White */
257                                          REPEAT(line[x] = 0xff);                                          REPEAT(setli(line, x, 0xffffffff, Bpp));
258                                          break;                                          break;
259    
260                                  case 0xe:       /* Black */                                  case 0xe:       /* Black */
261                                          REPEAT(line[x] = 0x00);                                          REPEAT(setli(line, x, 0, Bpp));
262                                          break;                                          break;
263    
264                                  default:                                  default:
# Line 246  bitmap_decompress(unsigned char *output, Line 270  bitmap_decompress(unsigned char *output,
270    
271          return True;          return True;
272  }  }
273    

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

  ViewVC Help
Powered by ViewVC 1.1.26