Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
228 lines (216 sloc) 7.43 KB
? 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;
+}
+
+
+
+
Something went wrong with that request. Please try again.