diff options
Diffstat (limited to 'tiff/tools/fax2tiff.c')
-rw-r--r-- | tiff/tools/fax2tiff.c | 465 |
1 files changed, 0 insertions, 465 deletions
diff --git a/tiff/tools/fax2tiff.c b/tiff/tools/fax2tiff.c deleted file mode 100644 index 951b568..0000000 --- a/tiff/tools/fax2tiff.c +++ /dev/null @@ -1,465 +0,0 @@ -/* $Id: fax2tiff.c,v 1.19.2.1 2010-06-08 18:50:43 bfriesen Exp $ */ - -/* - * Copyright (c) 1990-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * 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. - * - * 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 - * OF THIS SOFTWARE. - */ - -/* - * Convert a CCITT Group 3 or 4 FAX file to TIFF Group 3 or 4 format. - */ -#include "tif_config.h" - -#include <stdio.h> -#include <stdlib.h> /* should have atof & getopt */ - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#ifdef HAVE_FCNTL_H -# include <fcntl.h> -#endif - -#ifdef HAVE_IO_H -# include <io.h> -#endif - -#include "tiffiop.h" - -#ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -#endif -#ifndef EXIT_FAILURE -# define EXIT_FAILURE 1 -#endif - -#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) - -TIFF *faxTIFF; -char *rowbuf; -char *refbuf; - -uint32 xsize = 1728; -int verbose; -int stretch; -uint16 badfaxrun; -uint32 badfaxlines; - -int copyFaxFile(TIFF* tifin, TIFF* tifout); -static void usage(void); - -int -main(int argc, char* argv[]) -{ - FILE *in; - TIFF *out = NULL; - TIFFErrorHandler whandler = NULL; - int compression_in = COMPRESSION_CCITTFAX3; - int compression_out = COMPRESSION_CCITTFAX3; - int fillorder_in = FILLORDER_LSB2MSB; - int fillorder_out = FILLORDER_LSB2MSB; - uint32 group3options_in = 0; /* 1d-encoded */ - uint32 group3options_out = 0; /* 1d-encoded */ - uint32 group4options_in = 0; /* compressed */ - uint32 group4options_out = 0; /* compressed */ - uint32 defrowsperstrip = (uint32) 0; - uint32 rowsperstrip; - int photometric_in = PHOTOMETRIC_MINISWHITE; - int photometric_out = PHOTOMETRIC_MINISWHITE; - int mode = FAXMODE_CLASSF; - int rows; - int c; - int pn, npages; - float resY = 196.0; - extern int optind; - extern char* optarg; - - - while ((c = getopt(argc, argv, "R:X:o:1234ABLMPUW5678abcflmprsuvwz?")) != -1) - switch (c) { - /* input-related options */ - case '3': /* input is g3-encoded */ - compression_in = COMPRESSION_CCITTFAX3; - break; - case '4': /* input is g4-encoded */ - compression_in = COMPRESSION_CCITTFAX4; - break; - case 'U': /* input is uncompressed (g3 and g4) */ - group3options_in |= GROUP3OPT_UNCOMPRESSED; - group4options_in |= GROUP4OPT_UNCOMPRESSED; - break; - case '1': /* input is 1d-encoded (g3 only) */ - group3options_in &= ~GROUP3OPT_2DENCODING; - break; - case '2': /* input is 2d-encoded (g3 only) */ - group3options_in |= GROUP3OPT_2DENCODING; - break; - case 'P': /* input has not-aligned EOL (g3 only) */ - group3options_in &= ~GROUP3OPT_FILLBITS; - break; - case 'A': /* input has aligned EOL (g3 only) */ - group3options_in |= GROUP3OPT_FILLBITS; - break; - case 'W': /* input has 0 mean white */ - photometric_in = PHOTOMETRIC_MINISWHITE; - break; - case 'B': /* input has 0 mean black */ - photometric_in = PHOTOMETRIC_MINISBLACK; - break; - case 'L': /* input has lsb-to-msb fillorder */ - fillorder_in = FILLORDER_LSB2MSB; - break; - case 'M': /* input has msb-to-lsb fillorder */ - fillorder_in = FILLORDER_MSB2LSB; - break; - case 'R': /* input resolution */ - resY = (float) atof(optarg); - break; - case 'X': /* input width */ - xsize = (uint32) atoi(optarg); - break; - - /* output-related options */ - case '7': /* generate g3-encoded output */ - compression_out = COMPRESSION_CCITTFAX3; - break; - case '8': /* generate g4-encoded output */ - compression_out = COMPRESSION_CCITTFAX4; - break; - case 'u': /* generate uncompressed output (g3 and g4) */ - group3options_out |= GROUP3OPT_UNCOMPRESSED; - group4options_out |= GROUP4OPT_UNCOMPRESSED; - break; - case '5': /* generate 1d-encoded output (g3 only) */ - group3options_out &= ~GROUP3OPT_2DENCODING; - break; - case '6': /* generate 2d-encoded output (g3 only) */ - group3options_out |= GROUP3OPT_2DENCODING; - break; - case 'c': /* generate "classic" g3 format */ - mode = FAXMODE_CLASSIC; - break; - case 'f': /* generate Class F format */ - mode = FAXMODE_CLASSF; - break; - case 'm': /* output's fillorder is msb-to-lsb */ - fillorder_out = FILLORDER_MSB2LSB; - break; - case 'l': /* output's fillorder is lsb-to-msb */ - fillorder_out = FILLORDER_LSB2MSB; - break; - case 'o': - out = TIFFOpen(optarg, "w"); - if (out == NULL) { - fprintf(stderr, - "%s: Can not create or open %s\n", - argv[0], optarg); - return EXIT_FAILURE; - } - break; - case 'a': /* generate EOL-aligned output (g3 only) */ - group3options_out |= GROUP3OPT_FILLBITS; - break; - case 'p': /* generate not EOL-aligned output (g3 only) */ - group3options_out &= ~GROUP3OPT_FILLBITS; - break; - case 'r': /* rows/strip */ - defrowsperstrip = atol(optarg); - break; - case 's': /* stretch image by dup'ng scanlines */ - stretch = 1; - break; - case 'w': /* undocumented -- for testing */ - photometric_out = PHOTOMETRIC_MINISWHITE; - break; - case 'b': /* undocumented -- for testing */ - photometric_out = PHOTOMETRIC_MINISBLACK; - break; - case 'z': /* undocumented -- for testing */ - compression_out = COMPRESSION_LZW; - break; - case 'v': /* -v for info */ - verbose++; - break; - case '?': - usage(); - /*NOTREACHED*/ - } - npages = argc - optind; - if (npages < 1) - usage(); - - rowbuf = _TIFFmalloc(TIFFhowmany8(xsize)); - refbuf = _TIFFmalloc(TIFFhowmany8(xsize)); - if (rowbuf == NULL || refbuf == NULL) { - fprintf(stderr, "%s: Not enough memory\n", argv[0]); - return (EXIT_FAILURE); - } - - if (out == NULL) { - out = TIFFOpen("fax.tif", "w"); - if (out == NULL) { - fprintf(stderr, "%s: Can not create fax.tif\n", - argv[0]); - return (EXIT_FAILURE); - } - } - - faxTIFF = TIFFClientOpen("(FakeInput)", "w", - /* TIFFClientOpen() fails if we don't set existing value here */ - TIFFClientdata(out), - TIFFGetReadProc(out), TIFFGetWriteProc(out), - TIFFGetSeekProc(out), TIFFGetCloseProc(out), - TIFFGetSizeProc(out), TIFFGetMapFileProc(out), - TIFFGetUnmapFileProc(out)); - if (faxTIFF == NULL) { - fprintf(stderr, "%s: Can not create fake input file\n", - argv[0]); - return (EXIT_FAILURE); - } - TIFFSetMode(faxTIFF, O_RDONLY); - TIFFSetField(faxTIFF, TIFFTAG_IMAGEWIDTH, xsize); - TIFFSetField(faxTIFF, TIFFTAG_SAMPLESPERPIXEL, 1); - TIFFSetField(faxTIFF, TIFFTAG_BITSPERSAMPLE, 1); - TIFFSetField(faxTIFF, TIFFTAG_FILLORDER, fillorder_in); - TIFFSetField(faxTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(faxTIFF, TIFFTAG_PHOTOMETRIC, photometric_in); - TIFFSetField(faxTIFF, TIFFTAG_YRESOLUTION, resY); - TIFFSetField(faxTIFF, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); - - /* NB: this must be done after directory info is setup */ - TIFFSetField(faxTIFF, TIFFTAG_COMPRESSION, compression_in); - if (compression_in == COMPRESSION_CCITTFAX3) - TIFFSetField(faxTIFF, TIFFTAG_GROUP3OPTIONS, group3options_in); - else if (compression_in == COMPRESSION_CCITTFAX4) - TIFFSetField(faxTIFF, TIFFTAG_GROUP4OPTIONS, group4options_in); - for (pn = 0; optind < argc; pn++, optind++) { - in = fopen(argv[optind], "rb"); - if (in == NULL) { - fprintf(stderr, - "%s: %s: Can not open\n", argv[0], argv[optind]); - continue; - } -#if defined(_WIN32) && defined(USE_WIN32_FILEIO) - TIFFSetClientdata(faxTIFF, (thandle_t)_get_osfhandle(fileno(in))); -#else - TIFFSetClientdata(faxTIFF, (thandle_t)fileno(in)); -#endif - TIFFSetFileName(faxTIFF, (const char*)argv[optind]); - TIFFSetField(out, TIFFTAG_IMAGEWIDTH, xsize); - TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 1); - TIFFSetField(out, TIFFTAG_COMPRESSION, compression_out); - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric_out); - TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, 1); - switch (compression_out) { - /* g3 */ - case COMPRESSION_CCITTFAX3: - TIFFSetField(out, TIFFTAG_GROUP3OPTIONS, - group3options_out); - TIFFSetField(out, TIFFTAG_FAXMODE, mode); - rowsperstrip = - (defrowsperstrip)?defrowsperstrip:(uint32)-1L; - break; - - /* g4 */ - case COMPRESSION_CCITTFAX4: - TIFFSetField(out, TIFFTAG_GROUP4OPTIONS, - group4options_out); - TIFFSetField(out, TIFFTAG_FAXMODE, mode); - rowsperstrip = - (defrowsperstrip)?defrowsperstrip:(uint32)-1L; - break; - - default: - rowsperstrip = (defrowsperstrip) ? - defrowsperstrip : TIFFDefaultStripSize(out, 0); - } - TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip); - TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(out, TIFFTAG_FILLORDER, fillorder_out); - TIFFSetField(out, TIFFTAG_SOFTWARE, "fax2tiff"); - TIFFSetField(out, TIFFTAG_XRESOLUTION, 204.0); - if (!stretch) { - TIFFGetField(faxTIFF, TIFFTAG_YRESOLUTION, &resY); - TIFFSetField(out, TIFFTAG_YRESOLUTION, resY); - } else - TIFFSetField(out, TIFFTAG_YRESOLUTION, 196.); - TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); - TIFFSetField(out, TIFFTAG_PAGENUMBER, pn, npages); - - if (!verbose) - whandler = TIFFSetWarningHandler(NULL); - rows = copyFaxFile(faxTIFF, out); - fclose(in); - if (!verbose) - (void) TIFFSetWarningHandler(whandler); - - TIFFSetField(out, TIFFTAG_IMAGELENGTH, rows); - - if (verbose) { - fprintf(stderr, "%s:\n", argv[optind]); - fprintf(stderr, "%d rows in input\n", rows); - fprintf(stderr, "%ld total bad rows\n", - (long) badfaxlines); - fprintf(stderr, "%d max consecutive bad rows\n", badfaxrun); - } - if (compression_out == COMPRESSION_CCITTFAX3 && - mode == FAXMODE_CLASSF) { - TIFFSetField(out, TIFFTAG_BADFAXLINES, badfaxlines); - TIFFSetField(out, TIFFTAG_CLEANFAXDATA, badfaxlines ? - CLEANFAXDATA_REGENERATED : CLEANFAXDATA_CLEAN); - TIFFSetField(out, TIFFTAG_CONSECUTIVEBADFAXLINES, badfaxrun); - } - TIFFWriteDirectory(out); - } - TIFFClose(out); - _TIFFfree(rowbuf); - _TIFFfree(refbuf); - return (EXIT_SUCCESS); -} - -int -copyFaxFile(TIFF* tifin, TIFF* tifout) -{ - uint32 row; - uint32 linesize = TIFFhowmany8(xsize); - uint16 badrun; - int ok; - - tifin->tif_rawdatasize = TIFFGetFileSize(tifin); - tifin->tif_rawdata = _TIFFmalloc(tifin->tif_rawdatasize); - if (tifin->tif_rawdata == NULL) { - TIFFError(tifin->tif_name, "Not enough memory"); - return (0); - } - if (!ReadOK(tifin, tifin->tif_rawdata, tifin->tif_rawdatasize)) { - TIFFError(tifin->tif_name, "Read error at scanline 0"); - return (0); - } - tifin->tif_rawcp = tifin->tif_rawdata; - tifin->tif_rawcc = tifin->tif_rawdatasize; - - (*tifin->tif_setupdecode)(tifin); - (*tifin->tif_predecode)(tifin, (tsample_t) 0); - tifin->tif_row = 0; - badfaxlines = 0; - badfaxrun = 0; - - _TIFFmemset(refbuf, 0, linesize); - row = 0; - badrun = 0; /* current run of bad lines */ - while (tifin->tif_rawcc > 0) { - ok = (*tifin->tif_decoderow)(tifin, (tdata_t) rowbuf, - linesize, 0); - if (!ok) { - badfaxlines++; - badrun++; - /* regenerate line from previous good line */ - _TIFFmemcpy(rowbuf, refbuf, linesize); - } else { - if (badrun > badfaxrun) - badfaxrun = badrun; - badrun = 0; - _TIFFmemcpy(refbuf, rowbuf, linesize); - } - tifin->tif_row++; - - if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) { - fprintf(stderr, "%s: Write error at row %ld.\n", - tifout->tif_name, (long) row); - break; - } - row++; - if (stretch) { - if (TIFFWriteScanline(tifout, rowbuf, row, 0) < 0) { - fprintf(stderr, "%s: Write error at row %ld.\n", - tifout->tif_name, (long) row); - break; - } - row++; - } - } - if (badrun > badfaxrun) - badfaxrun = badrun; - _TIFFfree(tifin->tif_rawdata); - return (row); -} - -char* stuff[] = { -"usage: fax2tiff [options] input.raw...", -"where options are:", -" -3 input data is G3-encoded [default]", -" -4 input data is G4-encoded", -" -U input data is uncompressed (G3 or G4)", -" -1 input data is 1D-encoded (G3 only) [default]", -" -2 input data is 2D-encoded (G3 only)", -" -P input is not EOL-aligned (G3 only) [default]", -" -A input is EOL-aligned (G3 only)", -" -M input data has MSB2LSB bit order", -" -L input data has LSB2MSB bit order [default]", -" -B input data has min 0 means black", -" -W input data has min 0 means white [default]", -" -R # input data has # resolution (lines/inch) [default is 196]", -" -X # input data has # width [default is 1728]", -"", -" -o out.tif write output to out.tif", -" -7 generate G3-encoded output [default]", -" -8 generate G4-encoded output", -" -u generate uncompressed output (G3 or G4)", -" -5 generate 1D-encoded output (G3 only)", -" -6 generate 2D-encoded output (G3 only) [default]", -" -p generate not EOL-aligned output (G3 only)", -" -a generate EOL-aligned output (G3 only) [default]", -" -c generate \"classic\" TIFF format", -" -f generate TIFF Class F (TIFF/F) format [default]", -" -m output fill order is MSB2LSB", -" -l output fill order is LSB2MSB [default]", -" -r # make each strip have no more than # rows", -" -s stretch image by duplicating scanlines", -" -v print information about conversion work", -" -z generate LZW compressed output", -NULL -}; - -static void -usage(void) -{ - char buf[BUFSIZ]; - int i; - - setbuf(stderr, buf); - fprintf(stderr, "%s\n\n", TIFFGetVersion()); - for (i = 0; stuff[i] != NULL; i++) - fprintf(stderr, "%s\n", stuff[i]); - exit(EXIT_FAILURE); -} - -/* vim: set ts=8 sts=8 sw=8 noet: */ -/* - * Local Variables: - * mode: c - * c-basic-offset: 8 - * fill-column: 78 - * End: - */ |