ftp.nice.ch/pub/next/unix/graphics/urt.3.0.s.tar.gz#/urt.3.0.s/cnv/graytorle.c

This is graytorle.c in view mode; [Download] [Up]

/*
 * This software is copyrighted as noted below.  It may be freely copied,
 * modified, and redistributed, provided that the copyright notices are 
 * preserved on all copies.
 * 
 * There is no warranty or other guarantee of fitness for this software,
 * it is provided solely "as is".  Bug reports or fixes may be sent
 * to the author, who may or may not act on them as he desires.
 *
 * You may not include this software in a program or other software product
 * without supplying the source, or without informing the end-user that the 
 * source is available for no extra charge.
 *
 * If you modify this software, you should include a notice giving the
 * name of the person performing the modification, the date of modification,
 * and the reason for such modification.
 */
/* 
 * graytorle.c - Create an RLE image from gray pixels.
 * 
 * Author:	Michael J. Banks
 * 		Computer Science Dept.
 * 		University of Utah
 * Date:	Wed Jun 22 1988
 * Copyright (c) 1988, University of Utah
 */

#include <stdio.h>
#include "rle.h"

#ifdef USE_STDLIB_H
#include <stdlib.h>
#else

#ifdef VOID_STAR
extern void *malloc();
#else
extern char *malloc();
#endif
extern void free();

#endif /* USE_STDLIB_H */

typedef FILE	*FILPTR;

/*
 * usage : graytorle xsize ysize [-h hdrsize] [-o outfile] [-a] files ...
 *
 *    xsize,ysize	Size of input files.
 *    -h hdrsize	Input file header to discard.
 *    -o outfile	Output file name.
 *    -a		Uses first input file as alpha channel.
 */

void
main(argc, argv)
int  argc;
char *argv[];
{
    int			hflag = 0;	/* Header size flag */
    int 		aflag = 0;	/* Alpha channel flag. */
    int			stdin_used = 0;
    char 	       *oname = NULL;	/* Output file name. */
    FILE **inpfil;		/* Input file pointers. */
    int xsize, ysize;		/* Image size. */
    int hsize;			/* Image header size. */
    int oflag;	        	/* Output file flag. */
    int files;			/* Number of files. */
    char **fname;		/* List of input file names. */
    rle_pixel **outrow;		/* Output buffer. */
    int i, row;
    char *trash;

    if (! scanargs( argc,argv,
	"% a%- h%-hdrsize!d o%-outfile!s xsize!d ysize!d files!*s",
	    &aflag,
	    &hflag, &hsize,
	    &oflag, &oname,
	    &xsize, &ysize,
	    &files, &fname ))
	exit( -1 );

    /* 
     * Get enough file pointers for all input files that are specified,
     * and try to open them.
     */

    inpfil = (FILE **)malloc( sizeof( FILE * ) * files );
    for ( i=0; i<files; i++ )
    {
	inpfil[i] = rle_open_f( "graytorle", fname[i], "r" );
	if ( inpfil[i] == stdin )
	{
	    if ( stdin_used )
	    {
		fprintf( stderr,
			 "Can't use standard input for more than one file\n" );
		exit( -1 );
	    }
	    stdin_used++;
	}
    }

    /* Throw away file headers. */

    if ( hflag && (hsize > 0) ) 
    {
	trash = (char *)malloc( hsize );

	for ( i=0; i<files; i++ )
	    fread( trash, 1, hsize, inpfil[i] );

	free( trash );
    }

    /* Adjust alpha channnel flag to use as index. */

    if ( aflag ) 
	aflag = 1;
    else
	aflag = 0;

    /* Initialize the_hdr and allocate image row storage. */

    rle_dflt_hdr.alpha = aflag;
    rle_dflt_hdr.ncolors = files - aflag;
    rle_dflt_hdr.xmax = xsize - 1;
    rle_dflt_hdr.ymax = ysize - 1;
    rle_dflt_hdr.rle_file = rle_open_f("graytorle", oname, "w");
    for ( i = -aflag; i<rle_dflt_hdr.ncolors; i++)
	RLE_SET_BIT( rle_dflt_hdr, i );
    rle_addhist( argv, (rle_hdr *)NULL, &rle_dflt_hdr );
    rle_put_setup( &rle_dflt_hdr );

    if (rle_row_alloc( &rle_dflt_hdr, &outrow ))
    {
	fprintf(stderr, "Ran out of heap space!!\n");
	exit(-2);
    }

    /* Combine rows and write to output file.  Adjust for alpha. */

    for ( row=0; row<ysize; row++)
    {
	for ( i = -aflag; i<files-aflag; i++ )
	    fread( outrow[i], 1, xsize, inpfil[i+aflag] );
	rle_putrow( outrow, xsize, &rle_dflt_hdr );
    }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.