]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/tif_compress.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 
  30  * Compression Scheme Configuration Support. 
  35 TIFFNoEncode(TIFF
* tif
, char* method
) 
  37         const TIFFCodec
* c 
= TIFFFindCODEC(tif
->tif_dir
.td_compression
); 
  40                 TIFFError(tif
->tif_name
, "%s %s encoding is not implemented", 
  43                 TIFFError(tif
->tif_name
, 
  44                     "Compression scheme %u %s encoding is not implemented", 
  45                     tif
->tif_dir
.td_compression
, method
); 
  50 _TIFFNoRowEncode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
  52         (void) pp
; (void) cc
; (void) s
; 
  53         return (TIFFNoEncode(tif
, "scanline")); 
  57 _TIFFNoStripEncode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
  59         (void) pp
; (void) cc
; (void) s
; 
  60         return (TIFFNoEncode(tif
, "strip")); 
  64 _TIFFNoTileEncode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
  66         (void) pp
; (void) cc
; (void) s
; 
  67         return (TIFFNoEncode(tif
, "tile")); 
  71 TIFFNoDecode(TIFF
* tif
, char* method
) 
  73         const TIFFCodec
* c 
= TIFFFindCODEC(tif
->tif_dir
.td_compression
); 
  76                 TIFFError(tif
->tif_name
, "%s %s decoding is not implemented", 
  79                 TIFFError(tif
->tif_name
, 
  80                     "Compression scheme %u %s decoding is not implemented", 
  81                     tif
->tif_dir
.td_compression
, method
); 
  86 _TIFFNoRowDecode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
  88         (void) pp
; (void) cc
; (void) s
; 
  89         return (TIFFNoDecode(tif
, "scanline")); 
  93 _TIFFNoStripDecode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
  95         (void) pp
; (void) cc
; (void) s
; 
  96         return (TIFFNoDecode(tif
, "strip")); 
 100 _TIFFNoTileDecode(TIFF
* tif
, tidata_t pp
, tsize_t cc
, tsample_t s
) 
 102         (void) pp
; (void) cc
; (void) s
; 
 103         return (TIFFNoDecode(tif
, "tile")); 
 107 _TIFFNoSeek(TIFF
* tif
, uint32 off
) 
 110         TIFFError(tif
->tif_name
, 
 111             "Compression algorithm does not support random access"); 
 116 _TIFFNoPreCode(TIFF
* tif
, tsample_t s
) 
 118         (void) tif
; (void) s
; 
 122 static int _TIFFtrue(TIFF
* tif
) { (void) tif
; return (1); } 
 123 static void _TIFFvoid(TIFF
* tif
) { (void) tif
; } 
 126 _TIFFSetDefaultCompressionState(TIFF
* tif
) 
 128         tif
->tif_setupdecode 
= _TIFFtrue
; 
 129         tif
->tif_predecode 
= _TIFFNoPreCode
; 
 130         tif
->tif_decoderow 
= _TIFFNoRowDecode
; 
 131         tif
->tif_decodestrip 
= _TIFFNoStripDecode
; 
 132         tif
->tif_decodetile 
= _TIFFNoTileDecode
; 
 133         tif
->tif_setupencode 
= _TIFFtrue
; 
 134         tif
->tif_preencode 
= _TIFFNoPreCode
; 
 135         tif
->tif_postencode 
= _TIFFtrue
; 
 136         tif
->tif_encoderow 
= _TIFFNoRowEncode
; 
 137         tif
->tif_encodestrip 
= _TIFFNoStripEncode
; 
 138         tif
->tif_encodetile 
= _TIFFNoTileEncode
; 
 139         tif
->tif_close 
= _TIFFvoid
; 
 140         tif
->tif_seek 
= _TIFFNoSeek
; 
 141         tif
->tif_cleanup 
= _TIFFvoid
; 
 142         tif
->tif_defstripsize 
= _TIFFDefaultStripSize
; 
 143         tif
->tif_deftilesize 
= _TIFFDefaultTileSize
; 
 144         tif
->tif_flags 
&= ~TIFF_NOBITREV
; 
 148 TIFFSetCompressionScheme(TIFF
* tif
, int scheme
) 
 150         const TIFFCodec 
*c 
= TIFFFindCODEC(scheme
); 
 152         _TIFFSetDefaultCompressionState(tif
); 
 154          * Don't treat an unknown compression scheme as an error. 
 155          * This permits applications to open files with data that 
 156          * the library does not have builtin support for, but which 
 157          * may still be meaningful. 
 159         return (c 
? (*c
->init
)(tif
, scheme
) : 1); 
 163  * Other compression schemes may be registered.  Registered 
 164  * schemes can also override the builtin versions provided 
 167 typedef struct _codec 
{ 
 171 static  codec_t
* registeredCODECS 
= NULL
; 
 174 TIFFFindCODEC(uint16 scheme
) 
 179         for (cd 
= registeredCODECS
; cd
; cd 
= cd
->next
) 
 180                 if (cd
->info
->scheme 
== scheme
) 
 181                         return ((const TIFFCodec
*) cd
->info
); 
 182         for (c 
= _TIFFBuiltinCODECS
; c
->name
; c
++) 
 183                 if (c
->scheme 
== scheme
) 
 185         return ((const TIFFCodec
*) 0); 
 189 TIFFRegisterCODEC(uint16 scheme
, const char* name
, TIFFInitMethod init
) 
 191         codec_t
* cd 
= (codec_t
*) 
 192             _TIFFmalloc(sizeof (codec_t
) + sizeof (TIFFCodec
) + strlen(name
)+1); 
 195                 cd
->info 
= (TIFFCodec
*) ((tidata_t
) cd 
+ sizeof (codec_t
)); 
 196                 cd
->info
->name 
= (char*) 
 197                     ((tidata_t
) cd
->info 
+ sizeof (TIFFCodec
)); 
 198                 strcpy(cd
->info
->name
, name
); 
 199                 cd
->info
->scheme 
= scheme
; 
 200                 cd
->info
->init 
= init
; 
 201                 cd
->next 
= registeredCODECS
; 
 202                 registeredCODECS 
= cd
; 
 204                 TIFFError("TIFFRegisterCODEC", 
 205                     "No space to register compression scheme %s", name
); 
 210 TIFFUnRegisterCODEC(TIFFCodec
* c
) 
 215         for (pcd 
= ®isteredCODECS
; (cd 
= *pcd
); pcd 
= &cd
->next
) 
 221         TIFFError("TIFFUnRegisterCODEC", 
 222             "Cannot remove compression scheme %s; not registered", c
->name
);