LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_thunder.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 60 0 0.0 %
Date: 2012-12-26 Functions: 4 0 0.0 %

       1                 : /* $Id: tif_thunder.c,v 1.12 2011-04-02 20:54:09 bfriesen Exp $ */
       2                 : 
       3                 : /*
       4                 :  * Copyright (c) 1988-1997 Sam Leffler
       5                 :  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
       6                 :  *
       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.
      14                 :  * 
      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.  
      18                 :  * 
      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 
      24                 :  * OF THIS SOFTWARE.
      25                 :  */
      26                 : 
      27                 : #include "tiffiop.h"
      28                 : #include <assert.h>
      29                 : #ifdef THUNDER_SUPPORT
      30                 : /*
      31                 :  * TIFF Library.
      32                 :  *
      33                 :  * ThunderScan 4-bit Compression Algorithm Support
      34                 :  */
      35                 : 
      36                 : /*
      37                 :  * ThunderScan uses an encoding scheme designed for
      38                 :  * 4-bit pixel values.  Data is encoded in bytes, with
      39                 :  * each byte split into a 2-bit code word and a 6-bit
      40                 :  * data value.  The encoding gives raw data, runs of
      41                 :  * pixels, or pixel values encoded as a delta from the
      42                 :  * previous pixel value.  For the latter, either 2-bit
      43                 :  * or 3-bit delta values are used, with the deltas packed
      44                 :  * into a single byte.
      45                 :  */
      46                 : #define THUNDER_DATA    0x3f  /* mask for 6-bit data */
      47                 : #define THUNDER_CODE    0xc0  /* mask for 2-bit code word */
      48                 : /* code values */
      49                 : #define THUNDER_RUN   0x00  /* run of pixels w/ encoded count */
      50                 : #define THUNDER_2BITDELTAS  0x40  /* 3 pixels w/ encoded 2-bit deltas */
      51                 : #define     DELTA2_SKIP   2 /* skip code for 2-bit deltas */
      52                 : #define THUNDER_3BITDELTAS  0x80  /* 2 pixels w/ encoded 3-bit deltas */
      53                 : #define     DELTA3_SKIP   4 /* skip code for 3-bit deltas */
      54                 : #define THUNDER_RAW   0xc0  /* raw data encoded */
      55                 : 
      56                 : static const int twobitdeltas[4] = { 0, 1, 0, -1 };
      57                 : static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
      58                 : 
      59                 : #define SETPIXEL(op, v) {                     \
      60                 :   lastpixel = (v) & 0xf;                \
      61                 :         if ( npixels < maxpixels )         \
      62                 :         {                                     \
      63                 :     if (npixels++ & 1)                  \
      64                 :       *op++ |= lastpixel;               \
      65                 :     else                                \
      66                 :       op[0] = (uint8) (lastpixel << 4); \
      67                 :         }                                     \
      68                 : }
      69                 : 
      70                 : static int
      71               0 : ThunderSetupDecode(TIFF* tif)
      72                 : {
      73                 :   static const char module[] = "ThunderSetupDecode";
      74                 : 
      75               0 :         if( tif->tif_dir.td_bitspersample != 4 )
      76                 :         {
      77               0 :                 TIFFErrorExt(tif->tif_clientdata, module,
      78                 :                              "Wrong bitspersample value (%d), Thunder decoder only supports 4bits per sample.",
      79                 :                              (int) tif->tif_dir.td_bitspersample );
      80               0 :                 return 0;
      81                 :         }
      82                 :         
      83                 : 
      84               0 :   return (1);
      85                 : }
      86                 : 
      87                 : static int
      88               0 : ThunderDecode(TIFF* tif, uint8* op, tmsize_t maxpixels)
      89                 : {
      90                 :   static const char module[] = "ThunderDecode";
      91                 :   register unsigned char *bp;
      92                 :   register tmsize_t cc;
      93                 :   unsigned int lastpixel;
      94                 :   tmsize_t npixels;
      95                 : 
      96               0 :   bp = (unsigned char *)tif->tif_rawcp;
      97               0 :   cc = tif->tif_rawcc;
      98               0 :   lastpixel = 0;
      99               0 :   npixels = 0;
     100               0 :   while (cc > 0 && npixels < maxpixels) {
     101                 :     int n, delta;
     102                 : 
     103               0 :     n = *bp++, cc--;
     104               0 :     switch (n & THUNDER_CODE) {
     105                 :     case THUNDER_RUN:   /* pixel run */
     106                 :       /*
     107                 :        * Replicate the last pixel n times,
     108                 :        * where n is the lower-order 6 bits.
     109                 :        */
     110               0 :       if (npixels & 1) {
     111               0 :         op[0] |= lastpixel;
     112               0 :         lastpixel = *op++; npixels++; n--;
     113                 :       } else
     114               0 :         lastpixel |= lastpixel << 4;
     115               0 :       npixels += n;
     116               0 :       if (npixels < maxpixels) {
     117               0 :         for (; n > 0; n -= 2)
     118               0 :           *op++ = (uint8) lastpixel;
     119                 :       }
     120               0 :       if (n == -1)
     121               0 :         *--op &= 0xf0;
     122               0 :       lastpixel &= 0xf;
     123               0 :       break;
     124                 :     case THUNDER_2BITDELTAS:  /* 2-bit deltas */
     125               0 :       if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
     126               0 :         SETPIXEL(op, lastpixel + twobitdeltas[delta]);
     127               0 :       if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
     128               0 :         SETPIXEL(op, lastpixel + twobitdeltas[delta]);
     129               0 :       if ((delta = (n & 3)) != DELTA2_SKIP)
     130               0 :         SETPIXEL(op, lastpixel + twobitdeltas[delta]);
     131               0 :       break;
     132                 :     case THUNDER_3BITDELTAS:  /* 3-bit deltas */
     133               0 :       if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
     134               0 :         SETPIXEL(op, lastpixel + threebitdeltas[delta]);
     135               0 :       if ((delta = (n & 7)) != DELTA3_SKIP)
     136               0 :         SETPIXEL(op, lastpixel + threebitdeltas[delta]);
     137               0 :       break;
     138                 :     case THUNDER_RAW:   /* raw data */
     139               0 :       SETPIXEL(op, n);
     140                 :       break;
     141                 :     }
     142                 :   }
     143               0 :   tif->tif_rawcp = (uint8*) bp;
     144               0 :   tif->tif_rawcc = cc;
     145               0 :   if (npixels != maxpixels) {
     146                 : #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
     147                 :     TIFFErrorExt(tif->tif_clientdata, module,
     148                 :            "%s data at scanline %lu (%I64u != %I64u)",
     149                 :            npixels < maxpixels ? "Not enough" : "Too much",
     150                 :            (unsigned long) tif->tif_row,
     151                 :            (unsigned __int64) npixels,
     152                 :            (unsigned __int64) maxpixels);
     153                 : #else
     154               0 :     TIFFErrorExt(tif->tif_clientdata, module,
     155                 :            "%s data at scanline %lu (%llu != %llu)",
     156                 :            npixels < maxpixels ? "Not enough" : "Too much",
     157                 :            (unsigned long) tif->tif_row,
     158                 :            (unsigned long long) npixels,
     159                 :            (unsigned long long) maxpixels);
     160                 : #endif
     161               0 :     return (0);
     162                 :   }
     163                 : 
     164               0 :         return (1);
     165                 : }
     166                 : 
     167                 : static int
     168               0 : ThunderDecodeRow(TIFF* tif, uint8* buf, tmsize_t occ, uint16 s)
     169                 : {
     170                 :   static const char module[] = "ThunderDecodeRow";
     171               0 :   uint8* row = buf;
     172                 :   
     173                 :   (void) s;
     174               0 :   if (occ % tif->tif_scanlinesize)
     175                 :   {
     176               0 :     TIFFErrorExt(tif->tif_clientdata, module, "Fractional scanlines cannot be read");
     177               0 :     return (0);
     178                 :   }
     179               0 :   while (occ > 0) {
     180               0 :     if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
     181               0 :       return (0);
     182               0 :     occ -= tif->tif_scanlinesize;
     183               0 :     row += tif->tif_scanlinesize;
     184                 :   }
     185               0 :   return (1);
     186                 : }
     187                 : 
     188                 : int
     189               0 : TIFFInitThunderScan(TIFF* tif, int scheme)
     190                 : {
     191                 :   (void) scheme;
     192                 : 
     193               0 :         tif->tif_setupdecode = ThunderSetupDecode;
     194               0 :   tif->tif_decoderow = ThunderDecodeRow;
     195               0 :   tif->tif_decodestrip = ThunderDecodeRow; 
     196               0 :   return (1);
     197                 : }
     198                 : #endif /* THUNDER_SUPPORT */
     199                 : 
     200                 : /* vim: set ts=8 sts=8 sw=8 noet: */
     201                 : /*
     202                 :  * Local Variables:
     203                 :  * mode: c
     204                 :  * c-basic-offset: 8
     205                 :  * fill-column: 78
     206                 :  * End:
     207                 :  */

Generated by: LCOV version 1.7