/[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 345 by forsberg, Thu Mar 27 13:08:57 2003 UTC
# Line 1  Line 1 
1  /*  /* -*- c-basic-offset: 8 -*-
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    static uint32
26    cvalx(unsigned char **input, int Bpp)
27    {
28            uint32 rv = 0;
29            memcpy(&rv, *input, Bpp);
30            *input += Bpp;
31            return rv;
32    }
33    
34    static void
35    setli(unsigned char *input, int offset, uint32 value, int Bpp)
36    {
37            input += offset * Bpp;
38            memcpy(input, &value, Bpp);
39    }
40    
41    static uint32
42    getli(unsigned char *input, int offset, int Bpp)
43    {
44            uint32 rv = 0;
45            input += offset * Bpp;
46            memcpy(&rv, input, Bpp);
47            return rv;
48    }
49    
50  #define UNROLL8(exp) { exp exp exp exp exp exp exp exp }  #define UNROLL8(exp) { exp exp exp exp exp exp exp exp }
51    
52  #define REPEAT(statement) \  #define REPEAT(statement) \
# Line 43  Line 68 
68  }  }
69    
70  BOOL  BOOL
71  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,
72                      int Bpp)
73  {  {
74          unsigned char *end = input + size;          unsigned char *end = input + size;
75          unsigned char *prevline = NULL, *line = NULL;          unsigned char *prevline = NULL, *line = NULL;
76          int opcode, count, offset, isfillormix, x = width;          int opcode, count, offset, isfillormix, x = width;
77          int lastopcode = -1, insertmix = False, bicolour = False;          int lastopcode = -1, insertmix = False, bicolour = False;
78          uint8 code, colour1 = 0, colour2 = 0;          uint8 code;
79          uint8 mixmask, mask = 0, mix = 0xff;          uint32 colour1 = 0, colour2 = 0;
80            uint8 mixmask, mask = 0;
81            uint32 mix = 0xffffffff;
82          int fom_mask = 0;          int fom_mask = 0;
83    
84          while (input < end)          while (input < end)
# Line 117  bitmap_decompress(unsigned char *output, Line 145  bitmap_decompress(unsigned char *output,
145                                          insertmix = True;                                          insertmix = True;
146                                  break;                                  break;
147                          case 8: /* Bicolour */                          case 8: /* Bicolour */
148                                  colour1 = CVAL(input);                                  colour1 = cvalx(&input, Bpp);
149                          case 3: /* Colour */                          case 3: /* Colour */
150                                  colour2 = CVAL(input);                                  colour2 = cvalx(&input, Bpp);
151                                  break;                                  break;
152                          case 6: /* SetMix/Mix */                          case 6: /* SetMix/Mix */
153                          case 7: /* SetMix/FillOrMix */                          case 7: /* SetMix/FillOrMix */
154                                  mix = CVAL(input);                                  mix = cvalx(&input, Bpp);
155                                  opcode -= 5;                                  opcode -= 5;
156                                  break;                                  break;
157                          case 9: /* FillOrMix_1 */                          case 9: /* FillOrMix_1 */
# Line 154  bitmap_decompress(unsigned char *output, Line 182  bitmap_decompress(unsigned char *output,
182                                  height--;                                  height--;
183    
184                                  prevline = line;                                  prevline = line;
185                                  line = output + height * width;                                  line = output + height * width * Bpp;
186                          }                          }
187    
188                          switch (opcode)                          switch (opcode)
# Line 163  bitmap_decompress(unsigned char *output, Line 191  bitmap_decompress(unsigned char *output,
191                                          if (insertmix)                                          if (insertmix)
192                                          {                                          {
193                                                  if (prevline == NULL)                                                  if (prevline == NULL)
194                                                          line[x] = mix;                                                          setli(line, x, mix, Bpp);
195                                                  else                                                  else
196                                                          line[x] = prevline[x] ^ mix;                                                          setli(line, x,
197                                                                  getli(prevline, x, Bpp) ^ mix, Bpp);
198    
199                                                  insertmix = False;                                                  insertmix = False;
200                                                  count--;                                                  count--;
# Line 174  bitmap_decompress(unsigned char *output, Line 203  bitmap_decompress(unsigned char *output,
203    
204                                          if (prevline == NULL)                                          if (prevline == NULL)
205                                          {                                          {
206                                                  REPEAT(line[x] = 0);                                          REPEAT(setli(line, x, 0, Bpp))}
                                         }  
207                                          else                                          else
208                                          {                                          {
209                                                  REPEAT(line[x] = prevline[x]);                                                  REPEAT(setli
210                                                           (line, x, getli(prevline, x, Bpp), Bpp));
211                                          }                                          }
212                                          break;                                          break;
213    
214                                  case 1: /* Mix */                                  case 1: /* Mix */
215                                          if (prevline == NULL)                                          if (prevline == NULL)
216                                          {                                          {
217                                                  REPEAT(line[x] = mix);                                                  REPEAT(setli(line, x, mix, Bpp));
218                                          }                                          }
219                                          else                                          else
220                                          {                                          {
221                                                  REPEAT(line[x] = prevline[x] ^ mix);                                                  REPEAT(setli
222                                                           (line, x, getli(prevline, x, Bpp) ^ mix,
223                                                            Bpp));
224                                          }                                          }
225                                          break;                                          break;
226    
# Line 197  bitmap_decompress(unsigned char *output, Line 228  bitmap_decompress(unsigned char *output,
228                                          if (prevline == NULL)                                          if (prevline == NULL)
229                                          {                                          {
230                                                  REPEAT(MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
231                                                         if (mask & mixmask) line[x] = mix;                                                         if (mask & mixmask) setli(line, x, mix, Bpp);
232                                                         else                                                         else
233                                                         line[x] = 0;);                                                         setli(line, x, 0, Bpp););
234                                          }                                          }
235                                          else                                          else
236                                          {                                          {
237                                                  REPEAT(MASK_UPDATE();                                                  REPEAT(MASK_UPDATE();
238                                                         if (mask & mixmask)                                                         if (mask & mixmask)
239                                                         line[x] = prevline[x] ^ mix;                                                         setli(line, x, getli(prevline, x, Bpp) ^ mix,
240                                                                 Bpp);
241                                                         else                                                         else
242                                                         line[x] = prevline[x];);                                                         setli(line, x, getli(prevline, x, Bpp),
243                                                                 Bpp););
244                                          }                                          }
245                                          break;                                          break;
246    
247                                  case 3: /* Colour */                                  case 3: /* Colour */
248                                          REPEAT(line[x] = colour2);                                          REPEAT(setli(line, x, colour2, Bpp));
249                                          break;                                          break;
250    
251                                  case 4: /* Copy */                                  case 4: /* Copy */
252                                          REPEAT(line[x] = CVAL(input));                                          REPEAT(setli(line, x, cvalx(&input, Bpp), Bpp));
253                                          break;                                          break;
254    
255                                  case 8: /* Bicolour */                                  case 8: /* Bicolour */
256                                          REPEAT(if (bicolour)                                          REPEAT(if (bicolour)
257                                                 {                                                 {
258                                                 line[x] = colour2; bicolour = False;}                                                 setli(line, x, colour2, Bpp); bicolour = False;}
259                                                 else                                                 else
260                                                 {                                                 {
261                                                 line[x] = colour1; bicolour = True; count++;}                                                 setli(line, x, colour1, Bpp); bicolour = True;
262                                                   count++;}
263                                          );                                          );
264                                          break;                                          break;
265    
266                                  case 0xd:       /* White */                                  case 0xd:       /* White */
267                                          REPEAT(line[x] = 0xff);                                          REPEAT(setli(line, x, 0xffffffff, Bpp));
268                                          break;                                          break;
269    
270                                  case 0xe:       /* Black */                                  case 0xe:       /* Black */
271                                          REPEAT(line[x] = 0x00);                                          REPEAT(setli(line, x, 0, Bpp));
272                                          break;                                          break;
273    
274                                  default:                                  default:

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

  ViewVC Help
Powered by ViewVC 1.1.26