tif_compress.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:8k
源码类别:

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_compress.c,v 1.11 2005/12/21 12:23:13 joris Exp $ */
  2. /*
  3.  * Copyright (c) 1988-1997 Sam Leffler
  4.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * TIFF Library
  27.  *
  28.  * Compression Scheme Configuration Support.
  29.  */
  30. #include "tiffiop.h"
  31. static int
  32. TIFFNoEncode(TIFF* tif, const char* method)
  33. {
  34. const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
  35. if (c) { 
  36. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s %s encoding is not implemented",
  37.                           c->name, method);
  38. } else { 
  39. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  40.   "Compression scheme %u %s encoding is not implemented",
  41.     tif->tif_dir.td_compression, method);
  42. }
  43. return (-1);
  44. }
  45. int
  46. _TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  47. {
  48. (void) pp; (void) cc; (void) s;
  49. return (TIFFNoEncode(tif, "scanline"));
  50. }
  51. int
  52. _TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  53. {
  54. (void) pp; (void) cc; (void) s;
  55. return (TIFFNoEncode(tif, "strip"));
  56. }
  57. int
  58. _TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  59. {
  60. (void) pp; (void) cc; (void) s;
  61. return (TIFFNoEncode(tif, "tile"));
  62. }
  63. static int
  64. TIFFNoDecode(TIFF* tif, const char* method)
  65. {
  66. const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
  67. if (c)
  68. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "%s %s decoding is not implemented",
  69.     c->name, method);
  70. else
  71. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  72.     "Compression scheme %u %s decoding is not implemented",
  73.     tif->tif_dir.td_compression, method);
  74. return (-1);
  75. }
  76. int
  77. _TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  78. {
  79. (void) pp; (void) cc; (void) s;
  80. return (TIFFNoDecode(tif, "scanline"));
  81. }
  82. int
  83. _TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  84. {
  85. (void) pp; (void) cc; (void) s;
  86. return (TIFFNoDecode(tif, "strip"));
  87. }
  88. int
  89. _TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
  90. {
  91. (void) pp; (void) cc; (void) s;
  92. return (TIFFNoDecode(tif, "tile"));
  93. }
  94. int
  95. _TIFFNoSeek(TIFF* tif, uint32 off)
  96. {
  97. (void) off;
  98. TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
  99.     "Compression algorithm does not support random access");
  100. return (0);
  101. }
  102. int
  103. _TIFFNoPreCode(TIFF* tif, tsample_t s)
  104. {
  105. (void) tif; (void) s;
  106. return (1);
  107. }
  108. static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
  109. static void _TIFFvoid(TIFF* tif) { (void) tif; }
  110. void
  111. _TIFFSetDefaultCompressionState(TIFF* tif)
  112. {
  113. tif->tif_decodestatus = TRUE;
  114. tif->tif_setupdecode = _TIFFtrue;
  115. tif->tif_predecode = _TIFFNoPreCode;
  116. tif->tif_decoderow = _TIFFNoRowDecode;
  117. tif->tif_decodestrip = _TIFFNoStripDecode;
  118. tif->tif_decodetile = _TIFFNoTileDecode;
  119. tif->tif_encodestatus = TRUE;
  120. tif->tif_setupencode = _TIFFtrue;
  121. tif->tif_preencode = _TIFFNoPreCode;
  122. tif->tif_postencode = _TIFFtrue;
  123. tif->tif_encoderow = _TIFFNoRowEncode;
  124. tif->tif_encodestrip = _TIFFNoStripEncode;
  125. tif->tif_encodetile = _TIFFNoTileEncode;
  126. tif->tif_close = _TIFFvoid;
  127. tif->tif_seek = _TIFFNoSeek;
  128. tif->tif_cleanup = _TIFFvoid;
  129. tif->tif_defstripsize = _TIFFDefaultStripSize;
  130. tif->tif_deftilesize = _TIFFDefaultTileSize;
  131. tif->tif_flags &= ~TIFF_NOBITREV;
  132. }
  133. int
  134. TIFFSetCompressionScheme(TIFF* tif, int scheme)
  135. {
  136. const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
  137. _TIFFSetDefaultCompressionState(tif);
  138. /*
  139.  * Don't treat an unknown compression scheme as an error.
  140.  * This permits applications to open files with data that
  141.  * the library does not have builtin support for, but which
  142.  * may still be meaningful.
  143.  */
  144. return (c ? (*c->init)(tif, scheme) : 1);
  145. }
  146. /*
  147.  * Other compression schemes may be registered.  Registered
  148.  * schemes can also override the builtin versions provided
  149.  * by this library.
  150.  */
  151. typedef struct _codec {
  152. struct _codec* next;
  153. TIFFCodec* info;
  154. } codec_t;
  155. static codec_t* registeredCODECS = NULL;
  156. const TIFFCodec*
  157. TIFFFindCODEC(uint16 scheme)
  158. {
  159. const TIFFCodec* c;
  160. codec_t* cd;
  161. for (cd = registeredCODECS; cd; cd = cd->next)
  162. if (cd->info->scheme == scheme)
  163. return ((const TIFFCodec*) cd->info);
  164. for (c = _TIFFBuiltinCODECS; c->name; c++)
  165. if (c->scheme == scheme)
  166. return (c);
  167. return ((const TIFFCodec*) 0);
  168. }
  169. TIFFCodec*
  170. TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
  171. {
  172. codec_t* cd = (codec_t*)
  173.     _TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1);
  174. if (cd != NULL) {
  175. cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t));
  176. cd->info->name = (char*)
  177.     ((tidata_t) cd->info + sizeof (TIFFCodec));
  178. strcpy(cd->info->name, name);
  179. cd->info->scheme = scheme;
  180. cd->info->init = init;
  181. cd->next = registeredCODECS;
  182. registeredCODECS = cd;
  183. } else {
  184. TIFFErrorExt(0, "TIFFRegisterCODEC",
  185.     "No space to register compression scheme %s", name);
  186. return NULL;
  187. }
  188. return (cd->info);
  189. }
  190. void
  191. TIFFUnRegisterCODEC(TIFFCodec* c)
  192. {
  193. codec_t* cd;
  194. codec_t** pcd;
  195. for (pcd = &registeredCODECS; (cd = *pcd); pcd = &cd->next)
  196. if (cd->info == c) {
  197. *pcd = cd->next;
  198. _TIFFfree(cd);
  199. return;
  200. }
  201. TIFFErrorExt(0, "TIFFUnRegisterCODEC",
  202.     "Cannot remove compression scheme %s; not registered", c->name);
  203. }
  204. /************************************************************************/
  205. /*                       TIFFGetConfisuredCODECs()                      */
  206. /************************************************************************/
  207. /**
  208.  * Get list of configured codecs, both built-in and registered by user.
  209.  * Caller is responsible to free this structure.
  210.  * 
  211.  * @return returns array of TIFFCodec records (the last record should be NULL)
  212.  * or NULL if function failed.
  213.  */
  214. TIFFCodec*
  215. TIFFGetConfiguredCODECs()
  216. {
  217. int i = 1;
  218.         codec_t *cd;
  219.         const TIFFCodec *c;
  220. TIFFCodec *codecs = NULL, *new_codecs;
  221.         for (cd = registeredCODECS; cd; cd = cd->next) {
  222.                 new_codecs = (TIFFCodec *)
  223. _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
  224. if (!new_codecs) {
  225. _TIFFfree (codecs);
  226. return NULL;
  227. }
  228. codecs = new_codecs;
  229. _TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec));
  230. i++;
  231. }
  232.         for (c = _TIFFBuiltinCODECS; c->name; c++) {
  233.                 if (TIFFIsCODECConfigured(c->scheme)) {
  234.                         new_codecs = (TIFFCodec *)
  235. _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
  236. if (!new_codecs) {
  237. _TIFFfree (codecs);
  238. return NULL;
  239. }
  240. codecs = new_codecs;
  241. _TIFFmemcpy(codecs + i - 1, (const tdata_t)c, sizeof(TIFFCodec));
  242. i++;
  243. }
  244. }
  245. new_codecs = (TIFFCodec *) _TIFFrealloc(codecs, i * sizeof(TIFFCodec));
  246. if (!new_codecs) {
  247. _TIFFfree (codecs);
  248. return NULL;
  249. }
  250. codecs = new_codecs;
  251. _TIFFmemset(codecs + i - 1, 0, sizeof(TIFFCodec));
  252.         return codecs;
  253. }
  254. /* vim: set ts=8 sts=8 sw=8 noet: */