This is rletotiff.c in view mode; [Download] [Up]
/* rletotiff.c */
/*************************************************************************
* rletotiff - Main program for RLE to TIFF graphics format conversion.
*
* Written by Bailey Brown, Jr. June 4, 1990.
*************************************************************************
*/
#include "rle.h"
#undef TIFF /* Defined in rle_config.h and tiffio.h. */
#include <stdio.h>
#include "tiffio.h"
#ifndef USE_STRING_H
#include <strings.h>
#else
#include <string.h>
#endif
#define SETFIELD(tif, fieldname, arg) TIFFSetField(tif,fieldname,arg)
typedef unsigned char tiff_sample;
#ifdef USE_PROTOTYPES
void error(CONST_DECL char *s);
void get_tiff_scanline( tiff_sample* buf, int row);
void usage(void);
#else
void error();
void get_tiff_scanline();
void usage();
#endif
void get_scanlines();
static rle_hdr in_hdr;
static rle_pixel **scan;
/* needed to read all scanlines before converting
to tiff (rle is upside down) */
static rle_pixel **scan_red;
static rle_pixel **scan_green;
static rle_pixel **scan_blue;
static tiff_sample *RGBscanline;
TIFF *tif;
static u_short compression = COMPRESSION_LZW;
static int flip = 0;
static char * my_name = NULL;
void
main(argc, argv)
int argc;
char *argv[];
{
int i;
long int rows_per_strip;
int cflag = 0;
char *outfname = NULL, *infname = NULL;
my_name = cmd_name( argv );
if (sizeof(rle_pixel) != sizeof(tiff_sample))
error("tiff_sample and rle_pixel not same size");
if ( scanargs( argc, argv, "% Cc%- v%- o!-outfile.tiff!s infile.rle%s",
&cflag, &flip, &i, &outfname, &infname ) == 0 )
exit( 1 );
if ( cflag == 1 )
compression = COMPRESSION_LZW;
else if ( cflag == 2 )
compression = COMPRESSION_NONE;
in_hdr.rle_file = rle_open_f(cmd_name(argv), infname, "r");
rle_get_setup_ok( &in_hdr, cmd_name( argv ), infname );
in_hdr.xmax -= in_hdr.xmin;
in_hdr.xmin = 0;
in_hdr.ymax -= in_hdr.ymin;
in_hdr.ymin = 0;
if (in_hdr.ncolors != 3) error("infile must be 24-bit RGB");
get_scanlines();
/* rletotiff specific code comes after here */
RGBscanline = (tiff_sample*)malloc(
sizeof(tiff_sample)*3*(in_hdr.xmax+1));
if (RGBscanline == NULL) error("can't allocate RGB scanline");
tif = TIFFOpen(outfname, "w");
if (!tif) error("tiffopen ret null");
SETFIELD(tif,TIFFTAG_IMAGEWIDTH, in_hdr.xmax + 1);
SETFIELD(tif,TIFFTAG_IMAGELENGTH, in_hdr.ymax + 1);
SETFIELD(tif, TIFFTAG_COMPRESSION, compression);
rows_per_strip = (long)8*1024/(in_hdr.xmax+1);
if (rows_per_strip < 1) rows_per_strip = 1L;
SETFIELD(tif, TIFFTAG_ROWSPERSTRIP, rows_per_strip);
SETFIELD(tif, TIFFTAG_XRESOLUTION, 1.0);
SETFIELD(tif, TIFFTAG_YRESOLUTION, 1.0);
SETFIELD(tif, TIFFTAG_RESOLUTIONUNIT, 1);
SETFIELD(tif, TIFFTAG_BITSPERSAMPLE, 8);
SETFIELD(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
SETFIELD(tif, TIFFTAG_PLANARCONFIG, 1);
SETFIELD(tif, TIFFTAG_PHOTOMETRIC, 2);
for (i = 0; i < in_hdr.ymax + 1; i++) {
get_tiff_scanline(RGBscanline, i);
TIFFWriteScanline(tif, RGBscanline, i, 1);
}
TIFFClose(tif);
/* rletotiff specific code comes before here */
rle_row_free(&in_hdr, scan);
for (i = 0; i < in_hdr.ymax+1; i++ ) {
free(scan_red[i]);
free(scan_green[i]);
free(scan_blue[i]);
}
free(scan_red);
free(scan_green);
free(scan_blue);
}
/*
* get_scanlines() reads in all RLE raster data at once. This is
* necessary because of RLE stores images bottom to top and GIF stores
* them top to bottom.
*/
void
get_scanlines()
{
int i,j;
if (rle_row_alloc(&in_hdr, &scan) < 0) error("can't allocate scan");
scan_red = (rle_pixel**)malloc(sizeof(rle_pixel*)*(in_hdr.ymax+1));
scan_green = (rle_pixel**)malloc(sizeof(rle_pixel*)*(in_hdr.ymax+1));
scan_blue = (rle_pixel**)malloc(sizeof(rle_pixel*)*(in_hdr.ymax+1));
if (!(scan_red && scan_green && scan_blue))
error("can't allocate a scan buffer");
if (flip) {
for (i = 0; i < in_hdr.ymax+1; i++) {
rle_getrow(&in_hdr, scan);
scan_red[i] = scan[0];
scan_green[i] = scan[1];
scan_blue[i] = scan[2];
for (j=0; j < 3; j++) {
scan[j] = (rle_pixel*)malloc(sizeof(rle_pixel)*(in_hdr.xmax+1));
if (scan[j] == NULL) error("can't allocate current scanline");
}
}
} else {
for (i = 0; i < in_hdr.ymax+1; i++) {
rle_getrow(&in_hdr, scan);
scan_red[in_hdr.ymax - i] = scan[0];
scan_green[in_hdr.ymax - i] = scan[1];
scan_blue[in_hdr.ymax - i] = scan[2];
for (j=0; j < 3; j++) {
scan[j] = (rle_pixel*)malloc(sizeof(rle_pixel)*(in_hdr.xmax+1));
if (scan[j] == NULL) error("can't allocate current scanline");
}
}
}
}
void
get_tiff_scanline( buf, row )
tiff_sample *buf;
int row;
{
register int i;
register int k;
for (i=k=0; i < in_hdr.xmax+1; i++, k +=3) {
buf[k] = scan_red[row][i];
buf[k+1] = scan_green[row][i];
buf[k+2] = scan_blue[row][i];
}
}
void
error(s)
CONST_DECL char *s;
{
fprintf(stderr,"%s: %s\n", my_name, s);
exit(2);
}
void
usage()
{
fprintf(stderr,"Usage:\n");
fprintf(stderr,"\trletotiff [options] infile outfile\n");
fprintf(stderr,"options:\n");
fprintf(stderr,"\t-c lzw or -c none (compression, default lzw)\n");
fprintf(stderr,"\t-v (vertical flip, default not)\n");
exit(2);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.