]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/tif_thunder.c
   4  * Copyright (c) 1988-1997 Sam Leffler 
   5  * Copyright (c) 1991-1997 Silicon Graphics, Inc. 
   7  * Permission to use, copy, modify, distribute, and sell this software and 
   8  * its documentation for any purpose is hereby granted without fee, provided 
   9  * that (i) the above copyright notices and this permission notice appear in 
  10  * all copies of the software and related documentation, and (ii) the names of 
  11  * Sam Leffler and Silicon Graphics may not be used in any advertising or 
  12  * publicity relating to the software without the specific, prior written 
  13  * permission of Sam Leffler and Silicon Graphics. 
  15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 
  19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 
  20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 
  21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  28 #ifdef THUNDER_SUPPORT 
  32  * ThunderScan 4-bit Compression Algorithm Support 
  36  * ThunderScan uses an encoding scheme designed for 
  37  * 4-bit pixel values.  Data is encoded in bytes, with 
  38  * each byte split into a 2-bit code word and a 6-bit 
  39  * data value.  The encoding gives raw data, runs of 
  40  * pixels, or pixel values encoded as a delta from the 
  41  * previous pixel value.  For the latter, either 2-bit 
  42  * or 3-bit delta values are used, with the deltas packed 
  45 #define THUNDER_DATA            0x3f    /* mask for 6-bit data */ 
  46 #define THUNDER_CODE            0xc0    /* mask for 2-bit code word */ 
  48 #define THUNDER_RUN             0x00    /* run of pixels w/ encoded count */ 
  49 #define THUNDER_2BITDELTAS      0x40    /* 3 pixels w/ encoded 2-bit deltas */ 
  50 #define     DELTA2_SKIP         2       /* skip code for 2-bit deltas */ 
  51 #define THUNDER_3BITDELTAS      0x80    /* 2 pixels w/ encoded 3-bit deltas */ 
  52 #define     DELTA3_SKIP         4       /* skip code for 3-bit deltas */ 
  53 #define THUNDER_RAW             0xc0    /* raw data encoded */ 
  55 static const int twobitdeltas
[4] = { 0, 1, 0, -1 }; 
  56 static const int threebitdeltas
[8] = { 0, 1, 2, 3, 0, -3, -2, -1 }; 
  58 #define SETPIXEL(op, v) { \ 
  59         lastpixel = (v) & 0xf; \ 
  63             op[0] = lastpixel << 4; \ 
  67 ThunderDecode(TIFF
* tif
, tidata_t op
, tsize_t maxpixels
) 
  74         bp 
= (u_char 
*)tif
->tif_rawcp
; 
  78         while (cc 
> 0 && npixels 
< maxpixels
) { 
  82                 switch (n 
& THUNDER_CODE
) { 
  83                 case THUNDER_RUN
:               /* pixel run */ 
  85                          * Replicate the last pixel n times, 
  86                          * where n is the lower-order 6 bits. 
  90                                 lastpixel 
= *op
++; npixels
++; n
--; 
  92                                 lastpixel 
|= lastpixel 
<< 4; 
 100                 case THUNDER_2BITDELTAS
:        /* 2-bit deltas */ 
 101                         if ((delta 
= ((n 
>> 4) & 3)) != DELTA2_SKIP
) 
 102                                 SETPIXEL(op
, lastpixel 
+ twobitdeltas
[delta
]); 
 103                         if ((delta 
= ((n 
>> 2) & 3)) != DELTA2_SKIP
) 
 104                                 SETPIXEL(op
, lastpixel 
+ twobitdeltas
[delta
]); 
 105                         if ((delta 
= (n 
& 3)) != DELTA2_SKIP
) 
 106                                 SETPIXEL(op
, lastpixel 
+ twobitdeltas
[delta
]); 
 108                 case THUNDER_3BITDELTAS
:        /* 3-bit deltas */ 
 109                         if ((delta 
= ((n 
>> 3) & 7)) != DELTA3_SKIP
) 
 110                                 SETPIXEL(op
, lastpixel 
+ threebitdeltas
[delta
]); 
 111                         if ((delta 
= (n 
& 7)) != DELTA3_SKIP
) 
 112                                 SETPIXEL(op
, lastpixel 
+ threebitdeltas
[delta
]); 
 114                 case THUNDER_RAW
:               /* raw data */ 
 119         tif
->tif_rawcp 
= (tidata_t
) bp
; 
 121         if (npixels 
!= maxpixels
) { 
 122                 TIFFError(tif
->tif_name
, 
 123                     "ThunderDecode: %s data at scanline %ld (%lu != %lu)", 
 124                     npixels 
< maxpixels 
? "Not enough" : "Too much", 
 125                     (long) tif
->tif_row
, (long) npixels
, (long) maxpixels
); 
 131 static int LINKAGEMODE
 
 132 ThunderDecodeRow(TIFF
* tif
, tidata_t buf
, tsize_t occ
, tsample_t s
) 
 137         while ((long)occ 
> 0) { 
 138                 if (!ThunderDecode(tif
, row
, tif
->tif_dir
.td_imagewidth
)) 
 140                 occ 
-= tif
->tif_scanlinesize
; 
 141                 row 
+= tif
->tif_scanlinesize
; 
 147 TIFFInitThunderScan(TIFF
* tif
, int scheme
) 
 150         tif
->tif_decoderow 
= ThunderDecodeRow
; 
 151         tif
->tif_decodestrip 
= ThunderDecodeRow
; 
 154 #endif /* THUNDER_SUPPORT */