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

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

/* 
 * rlenoise.c - Add random (uniform) noise to an image.
 * 
 * Copyright 1988
 * Center for Information Technology Integration (CITI)
 * Information Technology Division
 * University of Michigan
 * Ann Arbor, Michigan
 *
 * Spencer W. Thomas
 *
 * Usage:
 * 	rlenoise [-a amount] [file]
 *
 * Adds random noise to an image.  May be useful when the image will
 * be output to a quantized display, and the display program doesn't
 * understand how to compensate.  (That's why I wrote it, anyway.)
 * Optionally, can specify the amount of noise (peak-to-peak) to add.
 * Default is 4 (because that's what I needed.)
 */

#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 */

/* Change this according the value on your system.  This is a crock. */
#define	RANDOM_MAX	((double)(int)(((unsigned int)~0)>>1))

#define MALLOC_ERR {fprintf(stderr, "%s: ran out of heap space\n",\
			    cmd_name(argv));exit(-2);}

void
main( argc, argv )
int argc;
char ** argv;
{
    int x, y, i;
    int oflag = 0, noise_amount = 4;
    char * in_fname = NULL, * out_fname = NULL;
    FILE *outfile = stdout;
    rle_hdr in_hdr, out_hdr;
    rle_pixel **inrows, **outrows;
    double rand_mult, newpix;
    int rle_err, rle_cnt;

#ifdef USE_RANDOM
    /* Use the BSD random() function */
    {
	long seed;
	(void)time( &seed );
	srandom( *(int *)&seed );
    }
#else
    /* use the standard Unix rand function if nothing better */
    {
	long seed;
	(void)time( &seed );
	srand( *(int *)&seed );
    }
#define random rand
#endif

    if ( scanargs( argc, argv, "% n%-amount!d o%-outfile!s infile%s",
		   &noise_amount, &noise_amount, &oflag, &out_fname, &in_fname) == 0 )
	exit( 1 );

    rand_mult = noise_amount / RANDOM_MAX;
    noise_amount /= 2;

    in_hdr.rle_file = rle_open_f(cmd_name( argv ), in_fname, "r");
   
    for ( rle_cnt = 0;
	  (rle_err = rle_get_setup( &in_hdr )) == RLE_SUCCESS;
	  rle_cnt++ )
    {
	/* Always write to stdout, well almost always */
	out_hdr = in_hdr;
	if ( rle_cnt == 0 )
	    outfile = rle_open_f( cmd_name( argv ), out_fname, "w" );
	out_hdr.rle_file = outfile;

	rle_addhist( argv, &in_hdr, &out_hdr );

	/* Init output file */
	rle_put_setup( &out_hdr );

	/* Get some memory */
	if ( rle_row_alloc( &in_hdr, &inrows ) )
	    MALLOC_ERR;
	/* Set up the output pointers.  This is a pain. */
	if ( (outrows = ((rle_pixel **) malloc(sizeof(rle_pixel *)
					       * out_hdr.ncolors + 1 ) + 1))
	     == NULL )
	    MALLOC_ERR;
	for ( i = -out_hdr.alpha; i < out_hdr.ncolors; i++ )
	    if ( inrows[i] )
		outrows[i] = inrows[i] + out_hdr.xmin;

	for ( y = in_hdr.ymin; y <= in_hdr.ymax; y++ )
	{
	    rle_getrow( &in_hdr, inrows );
	    for ( i = 0; i < in_hdr.ncolors; i++ )
		if ( inrows[i] != NULL )
		    for ( x = in_hdr.xmin; x <= in_hdr.xmax; x++ )
		    {
			newpix = inrows[i][x] + random() * rand_mult -
			    noise_amount + 0.5;
			if ( newpix < 0 )
			    newpix = 0;
			if ( newpix > 255 )
			    newpix = 255;
			inrows[i][x] = newpix;
		    }
	    rle_putrow( outrows, out_hdr.xmax - out_hdr.xmin + 1,
			&out_hdr );
	}

	rle_puteof( &out_hdr );

	/* Free memory. */
	rle_row_free( &in_hdr, inrows );
	free( outrows - 1 );
    }

    /* Check for an error.  EOF or EMPTY is ok if at least one image
     * has been read.  Otherwise, print an error message.
     */
    if ( rle_cnt == 0 || (rle_err != RLE_EOF && rle_err != RLE_EMPTY) )
	rle_get_error( rle_err, cmd_name( argv ), in_fname );

    exit( 0 );
}

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