* Copyright (c) 1988-1997 Sam Leffler
* Copyright (c) 1991-1997 Silicon Graphics, Inc.
*
- * Permission to use, copy, modify, distribute, and sell this software and
+ * Permission to use, copy, modify, distribute, and sell this software and
* its documentation for any purpose is hereby granted without fee, provided
* that (i) the above copyright notices and this permission notice appear in
* all copies of the software and related documentation, and (ii) the names of
* Sam Leffler and Silicon Graphics may not be used in any advertising or
* publicity relating to the software without the specific, prior written
* permission of Sam Leffler and Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
* IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
- * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THIS SOFTWARE.
*/
/*
* Encode a run of pixels.
*/
-static int LINKAGEMODE
+static int
PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
{
u_char* bp = (u_char*) buf;
state = RUN;
if (n > 128) {
*op++ = (tidata) -127;
- *op++ = b;
+ *op++ = (tidataval_t) b;
n -= 128;
goto again;
}
*op++ = (tidataval_t)(-(n-1));
- *op++ = b;
+ *op++ = (tidataval_t) b;
} else {
lastliteral = op;
*op++ = 0;
- *op++ = b;
+ *op++ = (tidataval_t) b;
state = LITERAL;
}
break;
state = LITERAL_RUN;
if (n > 128) {
*op++ = (tidata) -127;
- *op++ = b;
+ *op++ = (tidataval_t) b;
n -= 128;
goto again;
}
*op++ = (tidataval_t)(-(n-1)); /* encode run */
- *op++ = b;
+ *op++ = (tidataval_t) b;
} else { /* extend literal */
if (++(*lastliteral) == 127)
state = BASE;
- *op++ = b;
+ *op++ = (tidataval_t) b;
}
break;
case RUN: /* last object was run */
if (n > 1) {
if (n > 128) {
*op++ = (tidata) -127;
- *op++ = b;
+ *op++ = (tidataval_t) b;
n -= 128;
goto again;
}
*op++ = (tidataval_t)(-(n-1));
- *op++ = b;
+ *op++ = (tidataval_t) b;
} else {
lastliteral = op;
*op++ = 0;
- *op++ = b;
+ *op++ = (tidataval_t) b;
state = LITERAL;
}
break;
* the decoder if data is read, for example, by scanlines
* when it was encoded by strips.
*/
-static int LINKAGEMODE
+static int
PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
{
+#if defined(__hpux) && defined(__LP64__)
+ tsize_t rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
tsize_t rowsize = (tsize_t) tif->tif_data;
+#endif
assert(rowsize > 0);
+
+#ifdef YCBCR_SUPPORT
+ /*
+ * YCBCR data isn't really separable into rows, so we
+ * might as well encode the whole tile/strip as one chunk.
+ */
+ if( tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR ) {
+#if defined(__hpux) && defined(__LP64__)
+ rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
+ rowsize = (tsize_t) tif->tif_data;
+#endif
+ }
+#endif
+
while ((long)cc > 0) {
- if (PackBitsEncode(tif, bp, rowsize, s) < 0)
- return (-1);
- bp += rowsize;
- cc -= rowsize;
+ int chunk = rowsize;
+
+ if( cc < chunk )
+ chunk = cc;
+
+ if (PackBitsEncode(tif, bp, chunk, s) < 0)
+ return (-1);
+ bp += chunk;
+ cc -= chunk;
}
return (1);
}
-static int LINKAGEMODE
+static int
PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
{
char *bp;
if (n < 0) { /* replicate next byte -n+1 times */
if (n == -128) /* nop */
continue;
- n = -n + 1;
+ n = -n + 1;
+ if( occ < n )
+ {
+ TIFFWarning(tif->tif_name,
+ "PackBitsDecode: discarding %d bytes "
+ "to avoid buffer overrun",
+ n - occ);
+ n = occ;
+ }
occ -= n;
b = *bp++, cc--;
while (n-- > 0)
- *op++ = b;
+ *op++ = (tidataval_t) b;
} else { /* copy next n+1 bytes literally */
- _TIFFmemcpy(op, bp, ++n);
+ if (occ < n + 1)
+ {
+ TIFFWarning(tif->tif_name,
+ "PackBitsDecode: discarding %d bytes "
+ "to avoid buffer overrun",
+ n - occ + 1);
+ n = occ - 1;
+ }
+ _TIFFmemcpy(op, bp, ++n);
op += n; occ -= n;
bp += n; cc -= n;
}
(long) tif->tif_row);
return (0);
}
- /* check for buffer overruns? */
return (1);
}