--- /dev/null
+? fax.diff
+? devel/lib/Imager/Regops.pm
+Index: devel/Imager.pm
+===================================================================
+RCS file: /u02/cvsroot/Imager/devel/Imager.pm,v
+retrieving revision 1.12
+diff -u -r1.12 Imager.pm
+--- devel/Imager.pm 2001/05/05 14:40:23 1.12
++++ devel/Imager.pm 2001/05/07 12:58:59
+@@ -81,6 +81,7 @@
+
+ i_readtiff_wiol
+ i_writetiff_wiol
++ i_writetiff_wiol_faxable
+
+ i_readpng
+ i_writepng
+@@ -548,6 +549,7 @@
+ sub write {
+ my $self = shift;
+ my %input=(jpegquality=>75, gifquant=>'mc', lmdither=>6.0, lmfixed=>[], @_);
++
+ my ($fh, $rc, $fd, $IO);
+
+ my %iolready=( tiff=>1 ); # this will be SO MUCH BETTER once they are all in there
+@@ -572,7 +574,6 @@
+ }
+
+
+-
+ if ($iolready{$input{type}}) {
+ if ($fd) {
+ $IO = io_new_fd($fd);
+@@ -582,6 +583,11 @@
+ if (!i_writetiff_wiol($self->{IMG}, $IO)) { $self->{ERRSTR}='Could not write to buffer'; return undef; }
+ }
+
++ if ($input{type} eq 'fax') {
++ print STDERR "writing a faxable; TIFF\n";
++ if (!i_writetiff_wiol_faxable($self->{IMG}, $IO)) { $self->{ERRSTR}='Could not write to buffer'; return undef; }
++ }
++
+ my $data = io_slurp($IO);
+ if (!$data) { $self->{ERRSTR}='Could not slurp from buffer'; return undef; }
+
+@@ -668,6 +674,13 @@
+ $self->{DEBUG} && print "writing a raw file\n";
+ } elsif ( $input{type} eq 'tiff' ) {
+ $rc=i_writetiff_wiol($self->{IMG},io_new_fd($fd) );
++ if ( !defined($rc) ) {
++ $self->{ERRSTR}='unable to write tiff image'; return undef;
++ }
++ $self->{DEBUG} && print "writing a tiff file\n";
++ } elsif ( $input{type} eq 'fax' ) {
++ print STDERR "writing a faxable tiff (2)\n";
++ $rc=i_writetiff_wiol_faxable($self->{IMG},io_new_fd($fd) );
+ if ( !defined($rc) ) {
+ $self->{ERRSTR}='unable to write tiff image'; return undef;
+ }
+Index: devel/Imager.xs
+===================================================================
+RCS file: /u02/cvsroot/Imager/devel/Imager.xs,v
+retrieving revision 1.9
+diff -u -r1.9 Imager.xs
+--- devel/Imager.xs 2001/05/04 07:15:09 1.9
++++ devel/Imager.xs 2001/05/07 12:59:02
+@@ -1023,6 +1023,11 @@
+ Imager::ImgRaw im
+ Imager::IO ig
+
++undef_int
++i_writetiff_wiol_faxable(im, ig)
++ Imager::ImgRaw im
++ Imager::IO ig
++
+
+ #endif /* HAVE_LIBTIFF */
+
+Index: devel/feat.h
+===================================================================
+RCS file: /u02/cvsroot/Imager/devel/feat.h,v
+retrieving revision 1.1.1.1
+diff -u -r1.1.1.1 feat.h
+--- devel/feat.h 2001/03/25 11:55:00 1.1.1.1
++++ devel/feat.h 2001/05/07 12:59:02
+@@ -6,6 +6,7 @@
+ #endif
+ #ifdef HAVE_LIBTIFF
+ "tiff",
++ "fax",
+ #endif
+ #ifdef HAVE_LIBPNG
+ "png",
+Index: devel/tiff.c
+===================================================================
+RCS file: /u02/cvsroot/Imager/devel/tiff.c,v
+retrieving revision 1.1.1.1
+diff -u -r1.1.1.1 tiff.c
+--- devel/tiff.c 2001/03/25 11:55:00 1.1.1.1
++++ devel/tiff.c 2001/05/07 12:59:03
+@@ -344,3 +344,126 @@
+ return 1;
+ }
+
++undef_int
++i_writetiff_wiol_faxable(i_img *im, io_glue *ig) {
++ uint32 width, height;
++ i_color val;
++ unsigned char *linebuf = NULL;
++ uint32 y;
++ int linebufpos;
++ int ch, ci, rc;
++ uint32 x;
++ TIFF* tif;
++ int luma_channel;
++ uint32 rowsperstrip;
++
++ width = im->xsize;
++ height = im->ysize;
++
++ switch (im->channels) {
++ case 1:
++ luma_channel = 0;
++ break;
++ case 3:
++ luma_channel = 1;
++ break;
++ default:
++ /* This means a colorspace we don't handle yet */
++ mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels));
++ return 0;
++ }
++
++ /* Add code to get the filename info from the iolayer */
++ /* Also add code to check for mmapped code */
++
++ io_glue_commit_types(ig);
++ mm_log((1, "i_writetiff_wiol_faxable(im 0x%p, ig 0x%p)\n", im, ig));
++
++ /* FIXME: Enable the mmap interface */
++
++ tif = TIFFClientOpen("No name",
++ "wm",
++ (thandle_t) ig,
++ (TIFFReadWriteProc) ig->readcb,
++ (TIFFReadWriteProc) ig->writecb,
++ (TIFFSeekProc) comp_seek,
++ (TIFFCloseProc) ig->closecb,
++ (TIFFSizeProc) ig->sizecb,
++ (TIFFMapFileProc) NULL,
++ (TIFFUnmapFileProc) NULL);
++
++ if (!tif) {
++ mm_log((1, "i_writetiff_wiol_faxable: Unable to open tif file for writing\n"));
++ return 0;
++ }
++
++ mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels));
++
++ if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width) )
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height) )
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1) )
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; }
++
++ linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) );
++
++ if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) {
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; }
++
++ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
++ TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc);
++
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip));
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) ));
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG));
++
++ /*
++ if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, 204))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, 196))
++ { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; }
++ if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0;
++ }
++ */
++
++ for (y=0; y<height; y++) {
++ int linebufpos=0;
++ for(x=0; x<width; x+=8) {
++ int bits;
++ int bitpos;
++ uint8 bitval = 128;
++ linebuf[linebufpos]=0;
++ bits = width-x; if(bits>8) bits=8;
++ for(bitpos=0;bitpos<bits;bitpos++) {
++ int luma;
++ luma = im->data[(x+bitpos+y*im->xsize)*im->channels+luma_channel];
++ linebuf[linebufpos] |= ((luma>=128)?bitval:0);
++ bitval >>= 1;
++ }
++ linebufpos++;
++ }
++ if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) {
++ mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n"));
++ break;
++ }
++ }
++ (void) TIFFClose(tif);
++ if (linebuf) _TIFFfree(linebuf);
++ return 1;
++}
++
++
++
++