This is rlescale.c in view mode; [Download] [Up]
/*
* rlescale.c - Generate a gray-scale RLE file.
*
* Author: Spencer W. Thomas
* Electrical Engineering & Computer Science Dept.
* University of Michigan
* Date: Mon Jun 13 1988
* Copyright (c) 1988, University of Michigan
*
* Usage:
* rlescale [-c] [-n nsteps] [xsize] [ysize]
*
* Generates a xsize x ysize gray-scale RLE file (by default 480x512).
* Has color squares along the bottom, with nsteps (default 16) gray
* log stepped intensity gray rectangles above that. If -c is
* specified, does separate white, red, green, and blue scales.
*/
#include <stdio.h>
#include <rle.h>
#include <rle_raw.h>
#include <math.h>
void
main( argc, argv )
int argc;
char ** argv;
{
int xsize = 512, ysize = 480, nsteps = 16, cflag = 0, oflag = 0;
int y, i, * nscan;
rle_op ** scans;
char buf[80], *out_fname = NULL;
if ( scanargs(argc, argv, "% c%- n%-nsteps!d o%-outfile!s xsize%d ysize%d",
&cflag, &nsteps, &nsteps,
&oflag, &out_fname, &xsize, &ysize ) == 0 )
exit( 1 );
/* Sanity check parameters -- Runs must be at least 3 pixels long */
if ( xsize < 3 * nsteps || xsize < 24 )
{
fprintf( stderr,
"Image isn't wide enough for %d steps, should be at least %d pixels.\n",
nsteps, 24 < 3 * nsteps ? 3 * nsteps : 24 );
exit( 1 );
}
rle_dflt_hdr.ncolors = 3;
rle_dflt_hdr.alpha = 0; /* No coverage mask */
rle_dflt_hdr.xmax = xsize - 1;
rle_dflt_hdr.ymax = ysize - 1;
rle_dflt_hdr.rle_file = rle_open_f(cmd_name( argv ), out_fname, "w");
rle_addhist( argv, (rle_hdr *)0, &rle_dflt_hdr );
sprintf( buf, "IMAGE_TYPE=%s scale image with %d log steps",
cflag ? "Color" : "Gray", nsteps );
rle_putcom( buf, &rle_dflt_hdr );
/* Allocate storage for the output rows */
if ( rle_raw_alloc( &rle_dflt_hdr, &scans, &nscan ) )
{
fprintf( stderr, "%s: malloc failed\n", cmd_name( argv ) );
exit( -2 );
}
/* Create the header in the output file */
rle_put_setup( &rle_dflt_hdr );
/* Create the scanline for the color squares */
for ( i = 0; i < 8; i++ )
{
scans[0][i].u.run_val = (i & 1) ? 255 : 0;
scans[0][i].opcode = RRunDataOp;
scans[0][i].xloc = i * xsize / 8;
scans[0][i].length = (i + 1) * xsize / 8 - scans[0][i].xloc;
scans[1][i] = scans[0][i];
scans[1][i].u.run_val = (i & 2) ? 255 : 0;
scans[2][i] = scans[0][i];
scans[2][i].u.run_val = (i & 4) ? 255 : 0;
}
nscan[0] = 8;
nscan[1] = 8;
nscan[2] = 8;
/* Write the color squares */
for ( y = 0; y < ysize / 8; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
/* Create the data for the scale */
for ( i = 0; i < nsteps; i++ )
{
scans[0][i].u.run_val = (int)(255.0 / pow(2.0, i*(8.0/nsteps)) + 0.5);
scans[0][i].opcode = RRunDataOp;
scans[0][i].xloc = i * xsize / nsteps;
scans[0][i].length = (i + 1) * xsize / nsteps - scans[0][i].xloc;
scans[1][i] = scans[0][i];
scans[2][i] = scans[0][i];
}
nscan[0] = nsteps;
nscan[1] = nsteps;
nscan[2] = nsteps;
/* Draw the scale */
if ( !cflag )
for ( ; y < ysize; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
else
{
/* blue scale */
nscan[0] = nscan[1] = 0;
for ( ; y < ysize * 11./32. ; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
/* green scale */
nscan[1] = nsteps;
nscan[2] = 0;
for ( ; y < ysize * 18./32.; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
/* red scale */
nscan[0] = nsteps;
nscan[1] = 0;
for ( ; y < ysize * 25./32.; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
/* white scale */
nscan[1] = nscan[2] = nsteps;
for ( ; y < ysize; y++ )
rle_putraw( scans, nscan, &rle_dflt_hdr );
}
rle_raw_free( &rle_dflt_hdr, scans, nscan );
rle_puteof( &rle_dflt_hdr );
exit( 0 );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.