Commit | Line | Data |
---|---|---|
c2c42e64 TC |
1 | ? fax.diff |
2 | ? devel/lib/Imager/Regops.pm | |
3 | Index: devel/Imager.pm | |
4 | =================================================================== | |
5 | RCS file: /u02/cvsroot/Imager/devel/Imager.pm,v | |
6 | retrieving revision 1.12 | |
7 | diff -u -r1.12 Imager.pm | |
8 | --- devel/Imager.pm 2001/05/05 14:40:23 1.12 | |
9 | +++ devel/Imager.pm 2001/05/07 12:58:59 | |
10 | @@ -81,6 +81,7 @@ | |
11 | ||
12 | i_readtiff_wiol | |
13 | i_writetiff_wiol | |
14 | + i_writetiff_wiol_faxable | |
15 | ||
16 | i_readpng | |
17 | i_writepng | |
18 | @@ -548,6 +549,7 @@ | |
19 | sub write { | |
20 | my $self = shift; | |
21 | my %input=(jpegquality=>75, gifquant=>'mc', lmdither=>6.0, lmfixed=>[], @_); | |
22 | + | |
23 | my ($fh, $rc, $fd, $IO); | |
24 | ||
25 | my %iolready=( tiff=>1 ); # this will be SO MUCH BETTER once they are all in there | |
26 | @@ -572,7 +574,6 @@ | |
27 | } | |
28 | ||
29 | ||
30 | - | |
31 | if ($iolready{$input{type}}) { | |
32 | if ($fd) { | |
33 | $IO = io_new_fd($fd); | |
34 | @@ -582,6 +583,11 @@ | |
35 | if (!i_writetiff_wiol($self->{IMG}, $IO)) { $self->{ERRSTR}='Could not write to buffer'; return undef; } | |
36 | } | |
37 | ||
38 | + if ($input{type} eq 'fax') { | |
39 | + print STDERR "writing a faxable; TIFF\n"; | |
40 | + if (!i_writetiff_wiol_faxable($self->{IMG}, $IO)) { $self->{ERRSTR}='Could not write to buffer'; return undef; } | |
41 | + } | |
42 | + | |
43 | my $data = io_slurp($IO); | |
44 | if (!$data) { $self->{ERRSTR}='Could not slurp from buffer'; return undef; } | |
45 | ||
46 | @@ -668,6 +674,13 @@ | |
47 | $self->{DEBUG} && print "writing a raw file\n"; | |
48 | } elsif ( $input{type} eq 'tiff' ) { | |
49 | $rc=i_writetiff_wiol($self->{IMG},io_new_fd($fd) ); | |
50 | + if ( !defined($rc) ) { | |
51 | + $self->{ERRSTR}='unable to write tiff image'; return undef; | |
52 | + } | |
53 | + $self->{DEBUG} && print "writing a tiff file\n"; | |
54 | + } elsif ( $input{type} eq 'fax' ) { | |
55 | + print STDERR "writing a faxable tiff (2)\n"; | |
56 | + $rc=i_writetiff_wiol_faxable($self->{IMG},io_new_fd($fd) ); | |
57 | if ( !defined($rc) ) { | |
58 | $self->{ERRSTR}='unable to write tiff image'; return undef; | |
59 | } | |
60 | Index: devel/Imager.xs | |
61 | =================================================================== | |
62 | RCS file: /u02/cvsroot/Imager/devel/Imager.xs,v | |
63 | retrieving revision 1.9 | |
64 | diff -u -r1.9 Imager.xs | |
65 | --- devel/Imager.xs 2001/05/04 07:15:09 1.9 | |
66 | +++ devel/Imager.xs 2001/05/07 12:59:02 | |
67 | @@ -1023,6 +1023,11 @@ | |
68 | Imager::ImgRaw im | |
69 | Imager::IO ig | |
70 | ||
71 | +undef_int | |
72 | +i_writetiff_wiol_faxable(im, ig) | |
73 | + Imager::ImgRaw im | |
74 | + Imager::IO ig | |
75 | + | |
76 | ||
77 | #endif /* HAVE_LIBTIFF */ | |
78 | ||
79 | Index: devel/feat.h | |
80 | =================================================================== | |
81 | RCS file: /u02/cvsroot/Imager/devel/feat.h,v | |
82 | retrieving revision 1.1.1.1 | |
83 | diff -u -r1.1.1.1 feat.h | |
84 | --- devel/feat.h 2001/03/25 11:55:00 1.1.1.1 | |
85 | +++ devel/feat.h 2001/05/07 12:59:02 | |
86 | @@ -6,6 +6,7 @@ | |
87 | #endif | |
88 | #ifdef HAVE_LIBTIFF | |
89 | "tiff", | |
90 | + "fax", | |
91 | #endif | |
92 | #ifdef HAVE_LIBPNG | |
93 | "png", | |
94 | Index: devel/tiff.c | |
95 | =================================================================== | |
96 | RCS file: /u02/cvsroot/Imager/devel/tiff.c,v | |
97 | retrieving revision 1.1.1.1 | |
98 | diff -u -r1.1.1.1 tiff.c | |
99 | --- devel/tiff.c 2001/03/25 11:55:00 1.1.1.1 | |
100 | +++ devel/tiff.c 2001/05/07 12:59:03 | |
101 | @@ -344,3 +344,126 @@ | |
102 | return 1; | |
103 | } | |
104 | ||
105 | +undef_int | |
106 | +i_writetiff_wiol_faxable(i_img *im, io_glue *ig) { | |
107 | + uint32 width, height; | |
108 | + i_color val; | |
109 | + unsigned char *linebuf = NULL; | |
110 | + uint32 y; | |
111 | + int linebufpos; | |
112 | + int ch, ci, rc; | |
113 | + uint32 x; | |
114 | + TIFF* tif; | |
115 | + int luma_channel; | |
116 | + uint32 rowsperstrip; | |
117 | + | |
118 | + width = im->xsize; | |
119 | + height = im->ysize; | |
120 | + | |
121 | + switch (im->channels) { | |
122 | + case 1: | |
123 | + luma_channel = 0; | |
124 | + break; | |
125 | + case 3: | |
126 | + luma_channel = 1; | |
127 | + break; | |
128 | + default: | |
129 | + /* This means a colorspace we don't handle yet */ | |
130 | + mm_log((1, "i_writetiff_wiol_faxable: don't handle %d channel images.\n", im->channels)); | |
131 | + return 0; | |
132 | + } | |
133 | + | |
134 | + /* Add code to get the filename info from the iolayer */ | |
135 | + /* Also add code to check for mmapped code */ | |
136 | + | |
137 | + io_glue_commit_types(ig); | |
138 | + mm_log((1, "i_writetiff_wiol_faxable(im 0x%p, ig 0x%p)\n", im, ig)); | |
139 | + | |
140 | + /* FIXME: Enable the mmap interface */ | |
141 | + | |
142 | + tif = TIFFClientOpen("No name", | |
143 | + "wm", | |
144 | + (thandle_t) ig, | |
145 | + (TIFFReadWriteProc) ig->readcb, | |
146 | + (TIFFReadWriteProc) ig->writecb, | |
147 | + (TIFFSeekProc) comp_seek, | |
148 | + (TIFFCloseProc) ig->closecb, | |
149 | + (TIFFSizeProc) ig->sizecb, | |
150 | + (TIFFMapFileProc) NULL, | |
151 | + (TIFFUnmapFileProc) NULL); | |
152 | + | |
153 | + if (!tif) { | |
154 | + mm_log((1, "i_writetiff_wiol_faxable: Unable to open tif file for writing\n")); | |
155 | + return 0; | |
156 | + } | |
157 | + | |
158 | + mm_log((1, "i_writetiff_wiol_faxable: width=%d, height=%d, channels=%d\n", width, height, im->channels)); | |
159 | + | |
160 | + if (!TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width) ) | |
161 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField width=%d failed\n", width)); return 0; } | |
162 | + if (!TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height) ) | |
163 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField length=%d failed\n", height)); return 0; } | |
164 | + if (!TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1)) | |
165 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField samplesperpixel=1 failed\n")); return 0; } | |
166 | + if (!TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT)) | |
167 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Orientation=topleft\n")); return 0; } | |
168 | + if (!TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 1) ) | |
169 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField bitpersample=1\n")); return 0; } | |
170 | + if (!TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG)) | |
171 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField planarconfig\n")); return 0; } | |
172 | + if (!TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK)) | |
173 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField photometric=%d\n", PHOTOMETRIC_MINISBLACK)); return 0; } | |
174 | + if (!TIFFSetField(tif, TIFFTAG_COMPRESSION, 3)) | |
175 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField compression=3\n")); return 0; } | |
176 | + | |
177 | + linebuf = (unsigned char *)_TIFFmalloc( TIFFScanlineSize(tif) ); | |
178 | + | |
179 | + if (!TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, -1))) { | |
180 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField rowsperstrip=-1\n")); return 0; } | |
181 | + | |
182 | + TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); | |
183 | + TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rc); | |
184 | + | |
185 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField rowsperstrip=%d\n", rowsperstrip)); | |
186 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField scanlinesize=%d\n", TIFFScanlineSize(tif) )); | |
187 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFGetField planarconfig=%d == %d\n", rc, PLANARCONFIG_CONTIG)); | |
188 | + | |
189 | + /* | |
190 | + if (!TIFFSetField(tif, TIFFTAG_XRESOLUTION, 204)) | |
191 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Xresolution=204\n")); return 0; } | |
192 | + if (!TIFFSetField(tif, TIFFTAG_YRESOLUTION, 196)) | |
193 | + { mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField Yresolution=196\n")); return 0; } | |
194 | + if (!TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) { | |
195 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFSetField ResolutionUnit=%d\n", RESUNIT_INCH)); return 0; | |
196 | + } | |
197 | + */ | |
198 | + | |
199 | + for (y=0; y<height; y++) { | |
200 | + int linebufpos=0; | |
201 | + for(x=0; x<width; x+=8) { | |
202 | + int bits; | |
203 | + int bitpos; | |
204 | + uint8 bitval = 128; | |
205 | + linebuf[linebufpos]=0; | |
206 | + bits = width-x; if(bits>8) bits=8; | |
207 | + for(bitpos=0;bitpos<bits;bitpos++) { | |
208 | + int luma; | |
209 | + luma = im->data[(x+bitpos+y*im->xsize)*im->channels+luma_channel]; | |
210 | + linebuf[linebufpos] |= ((luma>=128)?bitval:0); | |
211 | + bitval >>= 1; | |
212 | + } | |
213 | + linebufpos++; | |
214 | + } | |
215 | + if (TIFFWriteScanline(tif, linebuf, y, 0) < 0) { | |
216 | + mm_log((1, "i_writetiff_wiol_faxable: TIFFWriteScanline failed.\n")); | |
217 | + break; | |
218 | + } | |
219 | + } | |
220 | + (void) TIFFClose(tif); | |
221 | + if (linebuf) _TIFFfree(linebuf); | |
222 | + return 1; | |
223 | +} | |
224 | + | |
225 | + | |
226 | + | |
227 | + |