diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | tools/tiffcrop.c | 588 |
2 files changed, 179 insertions, 415 deletions
@@ -1,3 +1,9 @@ +2009-11-03 Bob Friesenhahn <bfriesen@simple.dallas.tx.us> + + * tools/tiffcrop.c: Updated tiffcrop from Richard Nolde. This + version has undergone substantial testing with arbitrary sample + bit depths. Also eliminates GCC compilation warnings. + 2009-11-02 Bob Friesenhahn <bfriesen@simple.dallas.tx.us> * port/libport.h: Add extern declarations for getopt standard diff --git a/tools/tiffcrop.c b/tools/tiffcrop.c index 84882016..5f3801fd 100644 --- a/tools/tiffcrop.c +++ b/tools/tiffcrop.c @@ -1,4 +1,4 @@ -/* $Id: tiffcrop.c,v 1.14 2009-09-24 21:57:11 bfriesen Exp $ */ +/* $Id: tiffcrop.c,v 1.15 2009-11-03 15:24:27 bfriesen Exp $ */ /* tiffcrop.c -- a port of tiffcp.c extended to include manipulations of * the image data through additional options listed below @@ -28,7 +28,7 @@ * OR PERFORMANCE OF THIS SOFTWARE. * * Some portions of the current code are derived from tiffcp, primarly in - * the areas of lowlevel reading and writing of TAGSscanlines and tiles though + * the areas of lowlevel reading and writing of TAGS, scanlines and tiles though * some of the original functions have been extended to support arbitrary bit * depths. These functions are presented at the top of this file. * @@ -105,12 +105,10 @@ * selects which functions dump data, with higher numbers selecting * lower level, scanline level routines. Debug reports a limited set * of messages to monitor progess without enabling dump logs. - * -c for compression extended to allow explicit specification of RAW or AUTO mode - * with JPEG compression. */ -static char tiffcrop_version_id[] = "2.1"; -static char tiffcrop_rev_date[] = "09-18-2009"; +static char tiffcrop_version_id[] = "2.2"; +static char tiffcrop_rev_date[] = "11-03-2009"; #include "tif_config.h" #include "tiffiop.h" @@ -445,7 +443,7 @@ static int pageNum = 0; static int little_endian = 1; /* Functions adapted from tiffcp with additions or significant modifications */ -static int readContigStripsIntoBuffer (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); +static int readContigStripsIntoBuffer (TIFF*, uint8*); static int readSeparateStripsIntoBuffer (TIFF*, uint8*, uint32, uint32, tsample_t, struct dump_opts *); static int readContigTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16); static int readSeparateTilesIntoBuffer (TIFF*, uint8*, uint32, uint32, uint32, uint32, tsample_t, uint16); @@ -866,7 +864,7 @@ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); - return (1); + return 1; } break; case 1: if (bps == 1) @@ -880,7 +878,7 @@ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); - return (1); + return 1; } break; } @@ -894,7 +892,7 @@ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); - return (1); + return 1; } break; case 2: if (extractContigSamplesShifted24bits (src, dst, ncol, @@ -906,7 +904,7 @@ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); - return (1); + return 1; } break; case 3: @@ -920,11 +918,11 @@ static int readContigTilesIntoBuffer (TIFF* in, uint8* buf, TIFFError("readContigTilesIntoBuffer", "Unable to extract row %d from tile %lu", row, (unsigned long)TIFFCurrentTile(in)); - return (1); + return 1; } break; default: TIFFError("readContigTilesIntoBuffer", "Unsupported bit depth %d", bps); - return (1); + return 1; } } prev_trailing_bits += trailing_bits; @@ -1100,12 +1098,12 @@ static int writeBufferToContigStrips(TIFF* out, uint8* buf, uint32 imagelength) if (TIFFWriteEncodedStrip(out, strip++, buf, stripsize) < 0) { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); - return 0; + return 1; } buf += stripsize; } - return 1; + return 0; } /* Abandon plans to modify code so that plannar orientation separate images @@ -1135,12 +1133,12 @@ writeBufferToSeparateStrips (TIFF* out, uint8* buf, (void) TIFFGetFieldDefaulted(out, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); (void) TIFFGetField(out, TIFFTAG_BITSPERSAMPLE, &bps); bytes_per_sample = (bps + 7) / 8; - rowsize = ((bps * spp * width) + 7) / 8; - rowstripsize = rowsperstrip * bytes_per_sample * (width + 1); + rowsize = ((bps * spp * width) + 7) / 8; /* source has interleaved samples */ + rowstripsize = rowsperstrip * bytes_per_sample * (width + 1); obuf = _TIFFmalloc (rowstripsize); if (obuf == NULL) - return (0); + return 1; for (s = 0; s < spp; s++) { @@ -1155,7 +1153,7 @@ writeBufferToSeparateStrips (TIFF* out, uint8* buf, if (extractContigSamplesToBuffer(obuf, src, nrows, width, s, spp, bps, dump)) { _TIFFfree(obuf); - return (0); + return 1; } if ((dump->outfile != NULL) && (dump->level == 1)) { @@ -1169,13 +1167,13 @@ writeBufferToSeparateStrips (TIFF* out, uint8* buf, { TIFFError(TIFFFileName(out), "Error, can't write strip %u", strip - 1); _TIFFfree(obuf); - return 0; + return 1; } } } _TIFFfree(obuf); - return 1; + return 0; } /* Extract all planes from contiguous buffer into a single tile buffer @@ -1212,7 +1210,7 @@ static int writeBufferToContigTiles (TIFF* out, uint8* buf, uint32 imagelength, tilebuf = _TIFFmalloc(tile_buffsize); if (tilebuf == 0) - return 0; + return 1; src_rowsize = ((imagewidth * spp * bps) + 7) / 8; for (row = 0; row < imagelength; row += tl) @@ -1235,7 +1233,7 @@ static int writeBufferToContigTiles (TIFF* out, uint8* buf, uint32 imagelength, "Unable to extract data to tile for row %lu, col %lu", (unsigned long) row, (unsigned long)col); _TIFFfree(tilebuf); - return (0); + return 1; } if (TIFFWriteTile(out, tilebuf, col, row, 0, 0) < 0) @@ -1244,13 +1242,13 @@ static int writeBufferToContigTiles (TIFF* out, uint8* buf, uint32 imagelength, "Cannot write tile at %lu %lu", (unsigned long) col, (unsigned long) row); _TIFFfree(tilebuf); - return 0; + return 1; } } } _TIFFfree(tilebuf); - return 1; + return 0; } /* end writeBufferToContigTiles */ /* Extract each plane from contiguous buffer into a single tile buffer @@ -1269,7 +1267,7 @@ static int writeBufferToSeparateTiles (TIFF* out, uint8* buf, uint32 imagelength uint8* bufp = (uint8*) buf; if (obuf == NULL) - return 0; + return 1; TIFFGetField(out, TIFFTAG_TILELENGTH, &tl); TIFFGetField(out, TIFFTAG_TILEWIDTH, &tw); @@ -1299,7 +1297,7 @@ static int writeBufferToSeparateTiles (TIFF* out, uint8* buf, uint32 imagelength "Unable to extract data to tile for row %lu, col %lu sample %d", (unsigned long) row, (unsigned long)col, (int)s); _TIFFfree(obuf); - return (0); + return 1; } if (TIFFWriteTile(out, obuf, col, row, 0, s) < 0) @@ -1309,14 +1307,14 @@ static int writeBufferToSeparateTiles (TIFF* out, uint8* buf, uint32 imagelength (unsigned long) col, (unsigned long) row, (unsigned long) s); _TIFFfree(obuf); - return 0; + return 1; } } } } _TIFFfree(obuf); - return 1; + return 0; } /* end writeBufferToSeparateTiles */ static void @@ -2068,22 +2066,23 @@ update_output_file (TIFF **tiffout, char *mode, int autoindex, if (*tiffout == NULL) { TIFFError("update_output_file", "Unable to open output file %s\n", exportname); - return (1); + return 1; } *page = 0; - return (0); + return 0; } else (*page)++; - return (0); + return 0; } /* end update_output_file */ int main(int argc, char* argv[]) { + extern int optind; uint16 defconfig = (uint16) -1; uint16 deffillorder = 0; uint32 deftilewidth = (uint32) 0; @@ -2762,7 +2761,6 @@ extractContigSamples16bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff[2]; if ((src == NULL) || (dst == NULL)) { @@ -2804,19 +2802,13 @@ extractContigSamples16bits (uint8 *in, uint8 *out, uint32 cols, src = in + src_byte; matchbits = maskbits << (16 - src_bit - bps); + if (little_endian) - { - swapbuff[1] = *src; - swapbuff[0] = *(src + 1); - } + buff1 = (src[0] << 8) | src[1]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - } - buff1 = *((uint16 *)swapbuff); - buff1 = (buff1 & matchbits) << (src_bit); + buff1 = (src[1] << 8) | src[0]; + buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 8) /* add another bps bits to the buffer */ { bytebuff = 0; @@ -2858,7 +2850,6 @@ extractContigSamples24bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff1 = 0, bytebuff2 = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff[4]; if ((in == NULL) || (out == NULL)) { @@ -2901,21 +2892,9 @@ extractContigSamples24bits (uint8 *in, uint8 *out, uint32 cols, src = in + src_byte; matchbits = maskbits << (32 - src_bit - bps); if (little_endian) - { - swapbuff[3] = *src; - swapbuff[2] = *(src + 1); - swapbuff[1] = *(src + 2); - swapbuff[0] = *(src + 3); - } + buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - swapbuff[2] = *(src + 2); - swapbuff[3] = *(src + 3); - } - - buff1 = *((uint32 *)swapbuff); + buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); if (ready_bits < 16) /* add another bps bits to the buffer */ @@ -2965,8 +2944,6 @@ extractContigSamples32bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; if ((in == NULL) || (out == NULL)) { @@ -3012,37 +2989,15 @@ extractContigSamples32bits (uint8 *in, uint8 *out, uint32 cols, matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { - swapbuff1[3] = *src; - swapbuff1[2] = *(src + 1); - swapbuff1[1] = *(src + 2); - swapbuff1[0] = *(src + 3); - } - else - { - swapbuff1[0] = *src; - swapbuff1[1] = *(src + 1); - swapbuff1[2] = *(src + 2); - swapbuff1[3] = *(src + 3); - } - longbuff1 = *((uint32 *)swapbuff1); - - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *src; - swapbuff2[2] = *(src + 1); - swapbuff2[1] = *(src + 2); - swapbuff2[0] = *(src + 3); + longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; + longbuff2 = longbuff1; } else { - swapbuff2[0] = *src; - swapbuff2[1] = *(src + 1); - swapbuff2[2] = *(src + 2); - swapbuff2[3] = *(src + 3); + longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; + longbuff2 = longbuff1; } - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); @@ -3174,8 +3129,7 @@ extractContigSamplesShifted16bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff[2]; - + if ((src == NULL) || (dst == NULL)) { TIFFError("extractContigSamplesShifted16bits","Invalid input or output buffer"); @@ -3216,17 +3170,10 @@ extractContigSamplesShifted16bits (uint8 *in, uint8 *out, uint32 cols, src = in + src_byte; matchbits = maskbits << (16 - src_bit - bps); if (little_endian) - { - swapbuff[1] = *src; - swapbuff[0] = *(src + 1); - } + buff1 = (src[0] << 8) | src[1]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - } + buff1 = (src[1] << 8) | src[0]; - buff1 = *((uint16 *)swapbuff); if ((col == start) && (sindex == sample)) buff2 = buff1 & ((uint16)-1) << (8 - shift); @@ -3272,7 +3219,6 @@ extractContigSamplesShifted24bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff1 = 0, bytebuff2 = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff[4]; if ((in == NULL) || (out == NULL)) { @@ -3315,21 +3261,10 @@ extractContigSamplesShifted24bits (uint8 *in, uint8 *out, uint32 cols, src = in + src_byte; matchbits = maskbits << (32 - src_bit - bps); if (little_endian) - { - swapbuff[3] = *src; - swapbuff[2] = *(src + 1); - swapbuff[1] = *(src + 2); - swapbuff[0] = *(src + 3); - } + buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - swapbuff[2] = *(src + 2); - swapbuff[3] = *(src + 3); - } + buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; - buff1 = *((uint32 *)swapbuff); if ((col == start) && (sindex == sample)) buff2 = buff1 & ((uint32)-1) << (16 - shift); @@ -3383,8 +3318,6 @@ extractContigSamplesShifted32bits (uint8 *in, uint8 *out, uint32 cols, uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; uint8 *src = in; uint8 *dst = out; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; if ((in == NULL) || (out == NULL)) { @@ -3430,37 +3363,15 @@ extractContigSamplesShifted32bits (uint8 *in, uint8 *out, uint32 cols, matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { - swapbuff1[3] = *src; - swapbuff1[2] = *(src + 1); - swapbuff1[1] = *(src + 2); - swapbuff1[0] = *(src + 3); + longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; + longbuff2 = longbuff1; } else { - swapbuff1[0] = *src; - swapbuff1[1] = *(src + 1); - swapbuff1[2] = *(src + 2); - swapbuff1[3] = *(src + 3); + longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; + longbuff2 = longbuff1; } - longbuff1 = *((uint32 *)swapbuff1); - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *src; - swapbuff2[2] = *(src + 1); - swapbuff2[1] = *(src + 2); - swapbuff2[0] = *(src + 3); - } - else - { - swapbuff2[0] = *src; - swapbuff2[1] = *(src + 1); - swapbuff2[2] = *(src + 2); - swapbuff2[3] = *(src + 3); - } - - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; if ((col == start) && (sindex == sample)) buff2 = buff3 & ((uint64)-1) << (32 - shift); @@ -3654,14 +3565,13 @@ extractContigSamplesToTileBuffer(uint8 *out, uint8 *in, uint32 rows, uint32 cols return (0); } /* end extractContigSamplesToTileBuffer */ -static int readContigStripsIntoBuffer (TIFF* in, uint8* buf, uint32 length, uint32 width, - tsample_t spp, struct dump_opts * dump) +static int readContigStripsIntoBuffer (TIFF* in, uint8* buf) { uint8* bufp = buf; int32 bytes_read = 0; - uint16 nstrips = TIFFNumberOfStrips(in); + uint16 strip, nstrips = TIFFNumberOfStrips(in); uint32 stripsize = TIFFStripSize(in); - uint32 rows = 0, strip; + uint32 rows = 0; uint32 rps = TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &rps); tsize_t scanline_size = TIFFScanlineSize(in); @@ -3669,9 +3579,9 @@ static int readContigStripsIntoBuffer (TIFF* in, uint8* buf, uint32 length, uint { bytes_read = TIFFReadEncodedStrip (in, strip, bufp, -1); rows = bytes_read / scanline_size; - if (bytes_read != (int32)stripsize) - TIFFError("", "Bytes read %lu does not match reported strip size %lu", - (unsigned long) bytes_read, (unsigned long)stripsize); + if ((strip < (nstrips - 1)) && (bytes_read != (int32)stripsize)) + TIFFError("", "Strip %d: read %lu bytes, strip size %lu", + (int)strip + 1, (unsigned long) bytes_read, (unsigned long)stripsize); if (bytes_read < 0 && !ignore) { @@ -3858,7 +3768,6 @@ combineSeparateSamples16bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff[2]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -3890,17 +3799,10 @@ combineSeparateSamples16bits (uint8 *in[], uint8 *out, uint32 cols, { src = in[s] + src_offset + src_byte; if (little_endian) - { - swapbuff[1] = *src; - swapbuff[0] = *(src + 1); - } + buff1 = (src[0] << 8) | src[1]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - } + buff1 = (src[1] << 8) | src[0]; - buff1 = *((uint16 *)swapbuff); buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -3976,7 +3878,6 @@ combineSeparateSamples24bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff[4]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -4008,21 +3909,9 @@ combineSeparateSamples24bits (uint8 *in[], uint8 *out, uint32 cols, { src = in[s] + src_offset + src_byte; if (little_endian) - { - swapbuff[3] = *src; - swapbuff[2] = *(src + 1); - swapbuff[1] = *(src + 2); - swapbuff[0] = *(src + 3); - } + buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - swapbuff[2] = *(src + 2); - swapbuff[3] = *(src + 3); - } - - buff1 = *((uint32 *)swapbuff); + buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -4114,8 +4003,6 @@ combineSeparateSamples32bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -4149,37 +4036,14 @@ combineSeparateSamples32bits (uint8 *in[], uint8 *out, uint32 cols, src = in[s] + src_offset + src_byte; if (little_endian) { - swapbuff1[3] = *src; - swapbuff1[2] = *(src + 1); - swapbuff1[1] = *(src + 2); - swapbuff1[0] = *(src + 3); + longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; + longbuff2 = longbuff1; } else { - swapbuff1[0] = *src; - swapbuff1[1] = *(src + 1); - swapbuff1[2] = *(src + 2); - swapbuff1[3] = *(src + 3); + longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; + longbuff2 = longbuff1; } - longbuff1 = *((uint32 *)swapbuff1); - - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *src; - swapbuff2[2] = *(src + 1); - swapbuff2[1] = *(src + 2); - swapbuff2[0] = *(src + 3); - } - else - { - swapbuff2[0] = *src; - swapbuff2[1] = *(src + 1); - swapbuff2[2] = *(src + 2); - swapbuff2[3] = *(src + 3); - } - - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); @@ -4430,7 +4294,6 @@ combineSeparateTileSamples16bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff[2]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -4461,17 +4324,9 @@ combineSeparateTileSamples16bits (uint8 *in[], uint8 *out, uint32 cols, { src = in[s] + src_offset + src_byte; if (little_endian) - { - swapbuff[1] = *src; - swapbuff[0] = *(src + 1); - } + buff1 = (src[0] << 8) | src[1]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - } - - buff1 = *((uint16 *)swapbuff); + buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -4548,7 +4403,6 @@ combineSeparateTileSamples24bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff[4]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -4579,21 +4433,9 @@ combineSeparateTileSamples24bits (uint8 *in[], uint8 *out, uint32 cols, { src = in[s] + src_offset + src_byte; if (little_endian) - { - swapbuff[3] = *src; - swapbuff[2] = *(src + 1); - swapbuff[1] = *(src + 2); - swapbuff[0] = *(src + 3); - } + buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - swapbuff[2] = *(src + 2); - swapbuff[3] = *(src + 3); - } - - buff1 = *((uint32 *)swapbuff); + buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -4686,8 +4528,6 @@ combineSeparateTileSamples32bits (uint8 *in[], uint8 *out, uint32 cols, tsample_t s; unsigned char *src = in[0]; unsigned char *dst = out; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; char action[8]; if ((src == NULL) || (dst == NULL)) @@ -4720,37 +4560,15 @@ combineSeparateTileSamples32bits (uint8 *in[], uint8 *out, uint32 cols, src = in[s] + src_offset + src_byte; if (little_endian) { - swapbuff1[3] = *src; - swapbuff1[2] = *(src + 1); - swapbuff1[1] = *(src + 2); - swapbuff1[0] = *(src + 3); - } - else - { - swapbuff1[0] = *src; - swapbuff1[1] = *(src + 1); - swapbuff1[2] = *(src + 2); - swapbuff1[3] = *(src + 3); - } - longbuff1 = *((uint32 *)swapbuff1); - - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *src; - swapbuff2[2] = *(src + 1); - swapbuff2[1] = *(src + 2); - swapbuff2[0] = *(src + 3); + longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; + longbuff2 = longbuff1; } else { - swapbuff2[0] = *src; - swapbuff2[1] = *(src + 1); - swapbuff2[2] = *(src + 2); - swapbuff2[3] = *(src + 3); + longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; + longbuff2 = longbuff1; } - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); @@ -6026,7 +5844,7 @@ loadImage(TIFF* in, struct image_data *image, struct dump_opts *dump, unsigned c case STRIP: if (planar == PLANARCONFIG_CONTIG) { - if (!(readContigStripsIntoBuffer(in, read_buff, length, width, spp, dump))) + if (!(readContigStripsIntoBuffer(in, read_buff))) { TIFFError("loadImage", "Unable to read contiguous strips into buffer"); return (-1); @@ -6897,23 +6715,33 @@ writeSingleSection(TIFF *in, TIFF *out, struct image_data *image, uint16 input_jpeg_colormode, input_planar; struct cpTag* p; + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &input_photometric); + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &spp); + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &bps); + TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); CopyField(TIFFTAG_BITSPERSAMPLE, bps); CopyField(TIFFTAG_SAMPLESPERPIXEL, spp); + TIFFGetField(in, TIFFTAG_COMPRESSION, &input_compression); + /* This is the global variable compression which is set + * if the user has specified a command line option for + * a compression option. Should be passed around in one + * of the parameters instead of as a global. If no user + * option specified it will still be (uint16) -1. */ if (compression != (uint16)-1) TIFFSetField(out, TIFFTAG_COMPRESSION, compression); else - { + { /* OJPEG is no longer supported for writing so upgrade to JPEG */ if (input_compression == COMPRESSION_OJPEG) { TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_JPEG); compression = COMPRESSION_JPEG; } - else + else /* Use the compression from the input file */ CopyField(TIFFTAG_COMPRESSION, compression); } @@ -6925,27 +6753,24 @@ writeSingleSection(TIFF *in, TIFF *out, struct image_data *image, #endif if (compression == COMPRESSION_JPEG) { - if (TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &input_photometric)) + if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ + (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */ { - if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ - (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */ - { - TIFFError ("writeSingleSection", - "JPEG compression cannot be used with %s image data", - (input_photometric == PHOTOMETRIC_PALETTE) ? - "palette" : "mask"); - return (-1); - } - if (input_photometric == PHOTOMETRIC_RGB) - { - if (jpegcolormode == JPEGCOLORMODE_RGB) - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); - else - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - } + TIFFError ("writeSingleSection", + "JPEG compression cannot be used with %s image data", + (input_photometric == PHOTOMETRIC_PALETTE) ? + "palette" : "mask"); + return (-1); + } + if (input_photometric == PHOTOMETRIC_RGB) + { + if (jpegcolormode == JPEGCOLORMODE_RGB) + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); else + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + } + else TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); - } } else { @@ -6956,13 +6781,13 @@ writeSingleSection(TIFF *in, TIFF *out, struct image_data *image, TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric); } - if (((TIFFTAG_PHOTOMETRIC == PHOTOMETRIC_LOGL) || - (TIFFTAG_PHOTOMETRIC == PHOTOMETRIC_LOGLUV)) && + if (((input_photometric == PHOTOMETRIC_LOGL) || + (input_photometric == PHOTOMETRIC_LOGLUV)) && ((compression != COMPRESSION_SGILOG) && (compression != COMPRESSION_SGILOG24))) { - TIFFError("writeSingleSection", - "LogL and LogLuv data require SGI_LOG or SGI_LOG24"); + TIFFError("writeCroppedImage", + "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression"); return (-1); } @@ -7563,6 +7388,10 @@ writeCroppedImage(TIFF *in, TIFF *out, struct image_data *image, uint16 input_jpeg_colormode, input_planar; struct cpTag* p; + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &input_photometric); + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &spp); + TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &bps); + TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); @@ -7591,44 +7420,52 @@ writeCroppedImage(TIFF *in, TIFF *out, struct image_data *image, #endif if (compression == COMPRESSION_JPEG) { - if (TIFFGetField(in, TIFFTAG_PHOTOMETRIC, &input_photometric)) + if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ + (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */ { - if ((input_photometric == PHOTOMETRIC_PALETTE) || /* color map indexed */ - (input_photometric == PHOTOMETRIC_MASK)) /* $holdout mask */ - { - TIFFError ("writeCroppedImage", - "JPEG compression cannot be used with %s image data", - (input_photometric == PHOTOMETRIC_PALETTE) ? - "palette" : "mask"); - return (-1); - } - if (input_photometric == PHOTOMETRIC_RGB) - { - if (jpegcolormode == JPEGCOLORMODE_RGB) - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); - else - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - } - else - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); + TIFFError ("writeCroppedImage", + "JPEG compression cannot be used with %s image data", + (input_photometric == PHOTOMETRIC_PALETTE) ? + "palette" : "mask"); + return (-1); } + if (input_photometric == PHOTOMETRIC_RGB) + { + if (jpegcolormode == JPEGCOLORMODE_RGB) + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR); + else + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + } + else + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, input_photometric); } else { if (compression == COMPRESSION_SGILOG || compression == COMPRESSION_SGILOG24) + { TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ? PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); + } else - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric); + { + if (input_compression == COMPRESSION_SGILOG || + input_compression == COMPRESSION_SGILOG24) + { + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, spp == 1 ? + PHOTOMETRIC_LOGL : PHOTOMETRIC_LOGLUV); + } + else + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, image->photometric); + } } - if (((TIFFTAG_PHOTOMETRIC == PHOTOMETRIC_LOGL) || - (TIFFTAG_PHOTOMETRIC == PHOTOMETRIC_LOGLUV)) && + if (((input_photometric == PHOTOMETRIC_LOGL) || + (input_photometric == PHOTOMETRIC_LOGLUV)) && ((compression != COMPRESSION_SGILOG) && (compression != COMPRESSION_SGILOG24))) { TIFFError("writeCroppedImage", - "LogL and LogLuv data require SGI_LOG or SGI_LOG24"); + "LogL and LogLuv source data require SGI_LOG or SGI_LOG24 compression"); return (-1); } @@ -7787,20 +7624,33 @@ writeCroppedImage(TIFF *in, TIFF *out, struct image_data *image, if (outtiled) { if (config == PLANARCONFIG_CONTIG) - writeBufferToContigTiles (out, crop_buff, length, width, spp, dump); + { + if (writeBufferToContigTiles (out, crop_buff, length, width, spp, dump)) + TIFFError("","Unable to write contiguous tile data for page %d", pagenum); + } else - writeBufferToSeparateTiles (out, crop_buff, length, width, spp, dump); + { + if (writeBufferToSeparateTiles (out, crop_buff, length, width, spp, dump)) + TIFFError("","Unable to write separate tile data for page %d", pagenum); + } } else { if (config == PLANARCONFIG_CONTIG) - writeBufferToContigStrips (out, crop_buff, length); + { + if (writeBufferToContigStrips (out, crop_buff, length)) + TIFFError("","Unable to write contiguous strip data for page %d", pagenum); + } else - writeBufferToSeparateStrips(out, crop_buff, length, width, spp, dump); + { + if (writeBufferToSeparateStrips(out, crop_buff, length, width, spp, dump)) + TIFFError("","Unable to write separate strip data for page %d", pagenum); + } } if (!TIFFWriteDirectory(out)) { + TIFFError("","Failed to write IFD for page number %d", pagenum); TIFFClose(out); return (-1); } @@ -7894,7 +7744,6 @@ rotateContigSamples16bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint16 matchbits = 0, maskbits = 0; uint16 buff1 = 0, buff2 = 0; uint8 bytebuff = 0; - uint8 swapbuff[2]; uint8 *next; tsample_t sample; @@ -7935,17 +7784,10 @@ rotateContigSamples16bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, } matchbits = maskbits << (16 - src_bit - bps); if (little_endian) - { - swapbuff[1] = *next; - swapbuff[0] = *(next + 1); - } + buff1 = (next[0] << 8) | next[1]; else - { - swapbuff[0] = *next; - swapbuff[1] = *(next + 1); - } + buff1 = (next[1] << 8) | next[0]; - buff1 = *((uint16 *)swapbuff); buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -7985,7 +7827,6 @@ rotateContigSamples24bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint32 matchbits = 0, maskbits = 0; uint32 buff1 = 0, buff2 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0; - uint8 swapbuff[4]; uint8 *next; tsample_t sample; @@ -8027,21 +7868,9 @@ rotateContigSamples24bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, } matchbits = maskbits << (32 - src_bit - bps); if (little_endian) - { - swapbuff[3] = *next; - swapbuff[2] = *(next + 1); - swapbuff[1] = *(next + 2); - swapbuff[0] = *(next + 3); - } + buff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3]; else - { - swapbuff[0] = *next; - swapbuff[1] = *(next + 1); - swapbuff[2] = *(next + 2); - swapbuff[3] = *(next + 3); - } - - buff1 = *((uint32 *)swapbuff); + buff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0]; buff1 = (buff1 & matchbits) << (src_bit); /* If we have a full buffer's worth, write it out */ @@ -8091,8 +7920,6 @@ rotateContigSamples32bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, uint64 maskbits = 0, matchbits = 0; uint64 buff1 = 0, buff2 = 0, buff3 = 0; uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; uint8 *next; tsample_t sample; @@ -8142,37 +7969,15 @@ rotateContigSamples32bits(uint16 rotation, uint16 spp, uint16 bps, uint32 width, matchbits = maskbits << (64 - src_bit - bps); if (little_endian) { - swapbuff1[3] = *next; - swapbuff1[2] = *(next + 1); - swapbuff1[1] = *(next + 2); - swapbuff1[0] = *(next + 3); - } - else - { - swapbuff1[0] = *next; - swapbuff1[1] = *(next + 1); - swapbuff1[2] = *(next + 2); - swapbuff1[3] = *(next + 3); - } - longbuff1 = *((uint32 *)swapbuff1); - - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *next; - swapbuff2[2] = *(next + 1); - swapbuff2[1] = *(next + 2); - swapbuff2[0] = *(next + 3); + longbuff1 = (next[0] << 24) | (next[1] << 16) | (next[2] << 8) | next[3]; + longbuff2 = longbuff1; } else { - swapbuff2[0] = *next; - swapbuff2[1] = *(next + 1); - swapbuff2[2] = *(next + 2); - swapbuff2[3] = *(next + 3); + longbuff1 = (next[3] << 24) | (next[2] << 16) | (next[1] << 8) | next[0]; + longbuff2 = longbuff1; } - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & matchbits) << (src_bit); @@ -8572,7 +8377,6 @@ reverseSamples16bits (uint16 spp, uint16 bps, uint32 width, uint8 bytebuff = 0; unsigned char *src; unsigned char *dst; - unsigned char swapbuff[2]; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) @@ -8604,17 +8408,9 @@ reverseSamples16bits (uint16 spp, uint16 bps, uint32 width, src = ibuff + src_byte; match_bits = mask_bits << (16 - high_bit - bps); if (little_endian) - { - swapbuff[1] = *src; - swapbuff[0] = *(src + 1); - } + buff1 = (src[0] << 8) | src[1]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - } - - buff1 = *((uint16 *)swapbuff); + buff1 = (src[1] << 8) | src[0]; buff1 = (buff1 & match_bits) << (high_bit); if (ready_bits < 8) @@ -8656,7 +8452,6 @@ reverseSamples24bits (uint16 spp, uint16 bps, uint32 width, uint8 bytebuff1 = 0, bytebuff2 = 0; unsigned char *src; unsigned char *dst; - unsigned char swapbuff[4]; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) @@ -8688,21 +8483,9 @@ reverseSamples24bits (uint16 spp, uint16 bps, uint32 width, src = ibuff + src_byte; match_bits = mask_bits << (32 - high_bit - bps); if (little_endian) - { - swapbuff[3] = *src; - swapbuff[2] = *(src + 1); - swapbuff[1] = *(src + 2); - swapbuff[0] = *(src + 3); - } + buff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; else - { - swapbuff[0] = *src; - swapbuff[1] = *(src + 1); - swapbuff[2] = *(src + 2); - swapbuff[3] = *(src + 3); - } - - buff1 = *((uint32 *)swapbuff); + buff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; buff1 = (buff1 & match_bits) << (high_bit); if (ready_bits < 16) @@ -8755,8 +8538,6 @@ reverseSamples32bits (uint16 spp, uint16 bps, uint32 width, uint8 bytebuff1 = 0, bytebuff2 = 0, bytebuff3 = 0, bytebuff4 = 0; unsigned char *src; unsigned char *dst; - unsigned char swapbuff1[4]; - unsigned char swapbuff2[4]; tsample_t sample; if ((ibuff == NULL) || (obuff == NULL)) @@ -8797,37 +8578,14 @@ reverseSamples32bits (uint16 spp, uint16 bps, uint32 width, match_bits = mask_bits << (64 - high_bit - bps); if (little_endian) { - swapbuff1[3] = *src; - swapbuff1[2] = *(src + 1); - swapbuff1[1] = *(src + 2); - swapbuff1[0] = *(src + 3); + longbuff1 = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3]; + longbuff2 = longbuff1; } else { - swapbuff1[0] = *src; - swapbuff1[1] = *(src + 1); - swapbuff1[2] = *(src + 2); - swapbuff1[3] = *(src + 3); + longbuff1 = (src[3] << 24) | (src[2] << 16) | (src[1] << 8) | src[0]; + longbuff2 = longbuff1; } - longbuff1 = *((uint32 *)swapbuff1); - - memset (swapbuff2, '\0', sizeof(swapbuff2)); - if (little_endian) - { - swapbuff2[3] = *src; - swapbuff2[2] = *(src + 1); - swapbuff2[1] = *(src + 2); - swapbuff2[0] = *(src + 3); - } - else - { - swapbuff2[0] = *src; - swapbuff2[1] = *(src + 1); - swapbuff2[2] = *(src + 2); - swapbuff2[3] = *(src + 3); - } - - longbuff2 = *((uint32 *)swapbuff2); buff3 = ((uint64)longbuff1 << 32) | longbuff2; buff1 = (buff3 & match_bits) << (high_bit); @@ -8873,7 +8631,7 @@ reverseSamplesBytes (uint16 spp, uint16 bps, uint32 width, uint32 col, bytes_per_pixel, col_offset; uint8 bytebuff1; unsigned char swapbuff[32]; - + if ((src == NULL) || (dst == NULL)) { TIFFError("reverseSamplesBytes","Invalid input or output buffer"); |