This is rlehisto.c in view mode; [Download] [Up]
/* * rlehisto.c - Create histogram image of an RLE file. * * Author: Gregg Townsend * Department of Computer Science * University of Arizona * Date: June 23, 1990 * * Original version: * Author: Rod Bogart * Computer Science Dept. * University of Utah * Date: Thu Nov 6 1986 * Copyright (c) 1986 Rod Bogart * * Flags: * -b Don't count background color values for scaling. * Ineffective when -c specified. * -c Output cumulative values instead of discrete values. * -t Print totals of each value in each channel. * -h npix Set height of image. * -o fname Direct output to file. */ #ifndef lint static char rcs_ident[] = "$Id: rlehisto.c,v 3.0 90/08/03 15:23:01 spencer Exp $"; #endif #include <stdio.h> #include <rle.h> #ifdef USE_STDLIB_H #include <stdlib.h> #else #ifdef VOID_STAR extern void *malloc(), *calloc(); #else extern char *malloc(), *calloc(); #endif extern void free(); #endif /* USE_STDLIB_H */ #define MAXCHAN 10 void main(argc, argv) int argc; char *argv[]; { FILE *outfile = stdout; int i, j, bflag=0, cflag=0, tflag=0, oflag=0; int hist_height = 256; rle_hdr in_hdr; rle_pixel ** rows, ** rowsout; rle_pixel *pixptr; long *pixelcount[256]; long maxcount; long n; int chan, nchan; int rle_cnt, rle_err; char *infname = NULL, *outfname = NULL; if ( scanargs( argc, argv, "% b%- c%- t%- h%-height!d o%-outfile!s infile%s", &bflag, &cflag, &tflag, &i, &hist_height, &oflag, &outfname, &infname ) == 0 ) exit( 1 ); in_hdr.rle_file = rle_open_f("rlehisto", infname, "r"); for ( rle_cnt = 0; (rle_err = rle_get_setup( &in_hdr )) == RLE_SUCCESS; rle_cnt++ ) { if ( rle_cnt == 0 ) outfile = rle_open_f(cmd_name( argv ), outfname, "w"); /* Only pay attention to bflag if background color is defined. */ bflag = (bflag && in_hdr.bg_color != NULL); in_hdr.xmax -= in_hdr.xmin; in_hdr.xmin = 0; rle_dflt_hdr = in_hdr; rle_dflt_hdr.cmap = (rle_map *)NULL; rle_dflt_hdr.ncmap = 0; rle_dflt_hdr.cmaplen = 0; rle_dflt_hdr.background = 2; rle_dflt_hdr.bg_color = (int *)calloc( in_hdr.ncolors, sizeof(int) ); rle_dflt_hdr.alpha = 0; rle_dflt_hdr.comments = in_hdr.comments; rle_dflt_hdr.xmin = 0; rle_dflt_hdr.xmax = 255; rle_dflt_hdr.ymin = 0; rle_dflt_hdr.ymax = hist_height - 1; rle_dflt_hdr.rle_file = outfile; nchan = in_hdr.ncolors; if (!tflag) { rle_addhist( argv, &in_hdr, &rle_dflt_hdr ); rle_put_setup( &rle_dflt_hdr ); } if ( (rle_row_alloc( &rle_dflt_hdr, &rowsout )) || (rle_row_alloc( &in_hdr, &rows ) )) { fprintf( stderr, "rlehisto: malloc failed\n" ); exit( -2 ); } for ( j = 0; j < 256; j++) { if ( rle_cnt == 0 ) pixelcount[j] = (long *) malloc(sizeof(long) * nchan); for (chan=0; chan < nchan; chan++) { pixelcount[j][chan] = 0; } } maxcount = 0; for (j=in_hdr.ymin; j <= in_hdr.ymax; j++) { rle_getrow(&in_hdr, rows); for (chan=0; chan < nchan; chan++) { pixptr = rows[chan]; for (i=0; i < in_hdr.xmax + 1; i++) pixelcount[ *pixptr++ ][ chan ] += 1; } } /* create cumulative figures if those are wanted. */ if (cflag) { for (chan = 0; chan < nchan; chan++) { for (j = 1; j < 256; j++) pixelcount[j][chan] += pixelcount[j-1][chan]; if (pixelcount[255][chan] > maxcount) maxcount = pixelcount[255][chan]; } } else for ( chan = 0; chan < nchan; chan++ ) for ( j = 0; j < 256; j++ ) if ( bflag && j == in_hdr.bg_color[chan] ) continue; else if ( pixelcount[j][chan] > maxcount ) maxcount = pixelcount[j][chan]; /* after entire image has been read in, output the histogram */ if (tflag) { if ( rle_cnt > 0 ) fprintf( outfile, "\n\n" ); for (j = 0; j < 256; j++) { for (chan = 0; chan < nchan; chan++) if (j > 0 && cflag) { if (pixelcount[j][chan] != pixelcount[j-1][chan]) break; } else { if (pixelcount[j][chan] != 0) break; } if (chan == nchan) /* if all entries zero, suppress line */ continue; fprintf(outfile, "%3d.", j); for (chan = 0; chan < nchan; chan++) fprintf(outfile, "\t%ld", pixelcount[j][chan]); fprintf(outfile, "\n"); } } else { for (i = 0; i < hist_height; i++) { n = (maxcount * i) / (hist_height - 2); for (chan = 0; chan < nchan; chan++) { for (j = 0; j < 256; j++) { if (pixelcount[j][chan] > n) rowsout[chan][j] = 255; else rowsout[chan][j] = 0; } } rle_putrow( rowsout, 256, &rle_dflt_hdr); } rle_puteof( &rle_dflt_hdr ); } /* Free memory. */ rle_row_free( &rle_dflt_hdr, rowsout ); rle_row_free( &in_hdr, rows ); } /* 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 ), infname ); exit( 0 ); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.