]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/contrib/ras/tif2ras.c
45b9bce45359d954b01caf9092eb9d3bf7dc5061
2 static char id
[] = "$Id$";
5 * tif2ras.c - Converts from a Tagged Image File Format image to a Sun Raster.
7 * Copyright (c) 1990 by Sun Microsystems, Inc.
9 * Author: Patrick J. Naughton
10 * naughton@wind.sun.com
12 * Permission to use, copy, modify, and distribute this software and its
13 * documentation for any purpose and without fee is hereby granted,
14 * provided that the above copyright notice appear in all copies and that
15 * both that copyright notice and this permission notice appear in
16 * supporting documentation.
18 * This file is provided AS IS with no warranties of any kind. The author
19 * shall have no liability with respect to the infringement of copyrights,
20 * trade secrets or any patents by this file or any part thereof. In no
21 * event will the author be liable for any lost revenue or profits or
22 * other special, indirect and consequential damages.
24 * Comments and additions should be sent to the author:
28 * 2550 Garcia Ave, MS 14-40
29 * Mountain View, CA 94043
34 * 06-Mar-90: Change to byte encoded rasterfiles.
35 * fix bug in call to ReadScanline().
36 * fix bug in CVT() macro.
37 * fix assignment of td, (missing &).
40 * This program takes a MicroSoft/Aldus "Tagged Image File Format" image or
41 * "TIFF" file as input and writes a Sun Rasterfile [see rasterfile(5)]. The
42 * output file may be standard output, but the input TIFF file must be a real
43 * file since seek(2) is used.
47 #include <pixrect/pixrect_hs.h>
53 #define CVT(x) (((x) * 255) / ((1L<<16)-1))
55 boolean Verbose
= False
;
56 char *pname
; /* program name (used for error messages) */
63 fprintf(stderr
, s1
, pname
, s2
);
70 error("usage: %s -[vq] TIFFfile [rasterfile]\n", NULL
);
95 short samplesperpixel
;
101 Pixrect
*pix
; /* The Sun Pixrect */
102 colormap_t Colormap
; /* The Pixrect Colormap */
107 setbuf(stderr
, NULL
);
111 if ((++argv
)[0][0] == '-')
112 switch (argv
[0][1]) {
120 fprintf(stderr
, "%s: illegal option -%c.\n", pname
,
124 else if (inf
== NULL
)
126 else if (outf
== NULL
)
134 error("%s: can't read input file from a stream.\n", NULL
);
137 fprintf(stderr
, "Reading %s...", inf
);
139 tif
= TIFFOpen(inf
, "r");
142 error("%s: error opening TIFF file %s", inf
);
145 TIFFPrintDirectory(tif
, stderr
, True
, False
, False
);
146 TIFFGetField(tif
, TIFFTAG_BITSPERSAMPLE
, &bitspersample
);
147 if (bitspersample
> 8)
148 error("%s: can't handle more than 8-bits per sample\n", NULL
);
150 TIFFGetField(tif
, TIFFTAG_SAMPLESPERPIXEL
, &samplesperpixel
);
151 switch (samplesperpixel
) {
153 if (bitspersample
== 1)
163 error("%s: only handle 1-channel gray scale or 3-channel color\n");
166 TIFFGetField(tif
, TIFFTAG_IMAGEWIDTH
, &width
);
167 TIFFGetField(tif
, TIFFTAG_IMAGELENGTH
, &height
);
170 fprintf(stderr
, "%dx%dx%d image, ", width
, height
, depth
);
172 fprintf(stderr
, "%d bits/sample, %d samples/pixel, ",
173 bitspersample
, samplesperpixel
);
175 pix
= mem_create(width
, height
, depth
);
176 if (pix
== (Pixrect
*) NULL
)
177 error("%s: can't allocate memory for output pixrect...\n", NULL
);
179 numcolors
= (1 << bitspersample
);
181 TIFFGetField(tif
, TIFFTAG_PHOTOMETRIC
, &photometric
);
182 if (numcolors
== 2) {
184 fprintf(stderr
, "monochrome ");
185 Colormap
.type
= RMT_NONE
;
187 Colormap
.map
[0] = Colormap
.map
[1] = Colormap
.map
[2] = NULL
;
189 switch (photometric
) {
190 case PHOTOMETRIC_MINISBLACK
:
192 fprintf(stderr
, "%d graylevels (min=black), ", numcolors
);
193 Map
= (u_char
*) malloc(numcolors
* sizeof(u_char
));
194 for (i
= 0; i
< numcolors
; i
++)
195 Map
[i
] = (255 * i
) / numcolors
;
196 Colormap
.type
= RMT_EQUAL_RGB
;
197 Colormap
.length
= numcolors
;
198 Colormap
.map
[0] = Colormap
.map
[1] = Colormap
.map
[2] = Map
;
200 case PHOTOMETRIC_MINISWHITE
:
202 fprintf(stderr
, "%d graylevels (min=white), ", numcolors
);
203 Map
= (u_char
*) malloc(numcolors
* sizeof(u_char
));
204 for (i
= 0; i
< numcolors
; i
++)
205 Map
[i
] = 255 - ((255 * i
) / numcolors
);
206 Colormap
.type
= RMT_EQUAL_RGB
;
207 Colormap
.length
= numcolors
;
208 Colormap
.map
[0] = Colormap
.map
[1] = Colormap
.map
[2] = Map
;
210 case PHOTOMETRIC_RGB
:
212 fprintf(stderr
, "truecolor ");
213 Colormap
.type
= RMT_NONE
;
215 Colormap
.map
[0] = Colormap
.map
[1] = Colormap
.map
[2] = NULL
;
217 case PHOTOMETRIC_PALETTE
:
219 fprintf(stderr
, "colormapped ");
220 Colormap
.type
= RMT_EQUAL_RGB
;
221 Colormap
.length
= numcolors
;
222 memset(red
, 0, sizeof(red
));
223 memset(green
, 0, sizeof(green
));
224 memset(blue
, 0, sizeof(blue
));
225 TIFFGetField(tif
, TIFFTAG_COLORMAP
,
226 &redcolormap
, &greencolormap
, &bluecolormap
);
227 for (i
= 0; i
< numcolors
; i
++) {
228 red
[i
] = (u_char
) CVT(redcolormap
[i
]);
229 green
[i
] = (u_char
) CVT(greencolormap
[i
]);
230 blue
[i
] = (u_char
) CVT(bluecolormap
[i
]);
232 Colormap
.map
[0] = red
;
233 Colormap
.map
[1] = green
;
234 Colormap
.map
[2] = blue
;
236 case PHOTOMETRIC_MASK
:
237 error("%s: Don't know how to handle PHOTOMETRIC_MASK\n");
239 case PHOTOMETRIC_DEPTH
:
240 error("%s: Don't know how to handle PHOTOMETRIC_DEPTH\n");
243 error("%s: unknown photometric (cmap): %d\n", photometric
);
247 buf
= (u_char
*) malloc(TIFFScanlineSize(tif
));
249 error("%s: can't allocate memory for scanline buffer...\n", NULL
);
251 for (row
= 0; row
< height
; row
++) {
252 if (TIFFReadScanline(tif
, buf
, row
, 0) < 0)
253 error("%s: bad data read on line: %d\n", row
);
255 outp
= (u_char
*) mprd_addr(mpr_d(pix
), 0, row
);
256 switch (photometric
) {
257 case PHOTOMETRIC_RGB
:
258 if (samplesperpixel
== 4)
259 for (col
= 0; col
< width
; col
++) {
260 *outp
++ = *inp
++; /* Blue */
261 *outp
++ = *inp
++; /* Green */
262 *outp
++ = *inp
++; /* Red */
263 inp
++; /* skip alpha channel */
266 for (col
= 0; col
< width
; col
++) {
267 *outp
++ = *inp
++; /* Blue */
268 *outp
++ = *inp
++; /* Green */
269 *outp
++ = *inp
++; /* Red */
272 case PHOTOMETRIC_MINISWHITE
:
273 case PHOTOMETRIC_MINISBLACK
:
274 switch (bitspersample
) {
276 for (col
= 0; col
< ((width
+ 7) / 8); col
++)
280 for (col
= 0; col
< ((width
+ 3) / 4); col
++) {
281 *outp
++ = (*inp
>> 6) & 3;
282 *outp
++ = (*inp
>> 4) & 3;
283 *outp
++ = (*inp
>> 2) & 3;
284 *outp
++ = *inp
++ & 3;
288 for (col
= 0; col
< width
/ 2; col
++) {
290 *outp
++ = *inp
++ & 0xf;
294 for (col
= 0; col
< width
; col
++)
298 error("%s: bad bits/sample: %d\n", bitspersample
);
301 case PHOTOMETRIC_PALETTE
:
302 memcpy(outp
, inp
, width
);
305 error("%s: unknown photometric (write): %d\n", photometric
);
312 fprintf(stderr
, "done.\n");
314 if (outf
== NULL
|| strcmp(outf
, "Standard Output") == 0) {
315 outf
= "Standard Output";
318 if (!(fp
= fopen(outf
, "w")))
319 error("%s: %s couldn't be opened for writing.\n", outf
);
323 fprintf(stderr
, "Writing rasterfile in %s...", outf
);
325 if (pr_dump(pix
, fp
, &Colormap
, RT_BYTE_ENCODED
, 0) == PIX_ERR
)
326 error("%s: error writing Sun Rasterfile: %s\n", outf
);
329 fprintf(stderr
, "done.\n");