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

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_next.c,v 1.6 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. #include "tiffiop.h"
  26. #ifdef NEXT_SUPPORT
  27. /*
  28.  * TIFF Library.
  29.  *
  30.  * NeXT 2-bit Grey Scale Compression Algorithm Support
  31.  */
  32. #define SETPIXEL(op, v) {
  33. switch (npixels++ & 3) {
  34. case 0: op[0]  = (unsigned char) ((v) << 6); break;
  35. case 1: op[0] |= (v) << 4; break;
  36. case 2: op[0] |= (v) << 2; break;
  37. case 3: *op++ |= (v);    break;
  38. }
  39. }
  40. #define LITERALROW 0x00
  41. #define LITERALSPAN 0x40
  42. #define WHITE    ((1<<2)-1)
  43. static int
  44. NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
  45. {
  46. register unsigned char *bp, *op;
  47. register tsize_t cc;
  48. register int n;
  49. tidata_t row;
  50. tsize_t scanline;
  51. (void) s;
  52. /*
  53.  * Each scanline is assumed to start off as all
  54.  * white (we assume a PhotometricInterpretation
  55.  * of ``min-is-black'').
  56.  */
  57. for (op = buf, cc = occ; cc-- > 0;)
  58. *op++ = 0xff;
  59. bp = (unsigned char *)tif->tif_rawcp;
  60. cc = tif->tif_rawcc;
  61. scanline = tif->tif_scanlinesize;
  62. for (row = buf; (long)occ > 0; occ -= scanline, row += scanline) {
  63. n = *bp++, cc--;
  64. switch (n) {
  65. case LITERALROW:
  66. /*
  67.  * The entire scanline is given as literal values.
  68.  */
  69. if (cc < scanline)
  70. goto bad;
  71. _TIFFmemcpy(row, bp, scanline);
  72. bp += scanline;
  73. cc -= scanline;
  74. break;
  75. case LITERALSPAN: {
  76. int off;
  77. /*
  78.  * The scanline has a literal span
  79.  * that begins at some offset.
  80.  */
  81. off = (bp[0] * 256) + bp[1];
  82. n = (bp[2] * 256) + bp[3];
  83. if (cc < 4+n || off+n > scanline)
  84. goto bad;
  85. _TIFFmemcpy(row+off, bp+4, n);
  86. bp += 4+n;
  87. cc -= 4+n;
  88. break;
  89. }
  90. default: {
  91. register int npixels = 0, grey;
  92. unsigned long imagewidth = tif->tif_dir.td_imagewidth;
  93. /*
  94.  * The scanline is composed of a sequence
  95.  * of constant color ``runs''.  We shift
  96.  * into ``run mode'' and interpret bytes
  97.  * as codes of the form <color><npixels>
  98.  * until we've filled the scanline.
  99.  */
  100. op = row;
  101. for (;;) {
  102. grey = (n>>6) & 0x3;
  103. n &= 0x3f;
  104. while (n-- > 0)
  105. SETPIXEL(op, grey);
  106. if (npixels >= (int) imagewidth)
  107. break;
  108. if (cc == 0)
  109. goto bad;
  110. n = *bp++, cc--;
  111. }
  112. break;
  113. }
  114. }
  115. }
  116. tif->tif_rawcp = (tidata_t) bp;
  117. tif->tif_rawcc = cc;
  118. return (1);
  119. bad:
  120. TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "NeXTDecode: Not enough data for scanline %ld",
  121.     (long) tif->tif_row);
  122. return (0);
  123. }
  124. int
  125. TIFFInitNeXT(TIFF* tif, int scheme)
  126. {
  127. (void) scheme;
  128. tif->tif_decoderow = NeXTDecode;
  129. tif->tif_decodestrip = NeXTDecode;
  130. tif->tif_decodetile = NeXTDecode;
  131. return (1);
  132. }
  133. #endif /* NEXT_SUPPORT */
  134. /* vim: set ts=8 sts=8 sw=8 noet: */