This is avg4.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 notice is
* 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.
*/
/*
* avg4.c - Reduce image by half in X and Y, producing alphas even
* if they weren't there originally.
*
* Author: Rod Bogart & John W. Peterson
* Computer Science Dept.
* University of Utah
* Date: Fri Jun 20 1986
* Copyright (c) 1986, University of Utah
*
*/
#ifndef lint
static char rcs_ident[] = "$Header: /usr/users/spencer/src/urt/tools/RCS/avg4.c,v 3.0 90/08/03 15:21:41 spencer Exp $";
#endif
#include <stdio.h>
#include <rle.h>
#ifdef USE_STDLIB_H
#include <stdlib.h>
#endif /* USE_STDLIB_H */
#define MALLOC_ERR {fprintf(stderr, "avg4: ran out of heap space\n");exit(-2);}
static bit_count[16] = {0, 63, 63, 127, 63, 127, 127,
192, 63, 127, 127, 192, 127, 192, 192, 255};
void
main(argc, argv)
int argc;
char *argv[];
{
char *infname = NULL, *outfname = NULL;
char *cmd = cmd_name( argv );
int oflag = 0;
int rle_cnt;
FILE *outfile = stdout;
int i, j;
int new_xlen,
new_ylen;
int rle_err;
rle_hdr in_hdr, out_hdr;
rle_pixel **rows0, **rows1, **rowsout;
rle_pixel *ptr0, *ptr1, *ptrout, *alphptr;
int A, chan;
if ( scanargs( argc, argv, "% o%-outfile!s infile%s",
&oflag, &outfname, &infname ) == 0 )
exit( 1 );
in_hdr.rle_file = rle_open_f( cmd, 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, outfname, "w" );
out_hdr = in_hdr;
rle_addhist( argv, &in_hdr, &out_hdr );
new_xlen = (in_hdr.xmax - in_hdr.xmin +1 ) / 2;
new_ylen = (in_hdr.ymax - in_hdr.ymin +1 ) / 2;
out_hdr.xmin = in_hdr.xmin / 2;
out_hdr.ymin = in_hdr.ymin / 2;
out_hdr.xmax = out_hdr.xmin + new_xlen - 1;
out_hdr.ymax = out_hdr.ymin + new_ylen - 1;
out_hdr.alpha = 1; /* Force alpha in output. */
RLE_SET_BIT( out_hdr, RLE_ALPHA );
out_hdr.rle_file = outfile;
rle_put_setup( &out_hdr );
/* Oink. */
if (rle_row_alloc( &in_hdr, &rows0 ))
MALLOC_ERR;
if (rle_row_alloc( &in_hdr, &rows1 ))
MALLOC_ERR;
if (rle_row_alloc( &out_hdr, &rowsout ))
MALLOC_ERR;
for ( j = 0; j < new_ylen*2; j+=2 )
{
rle_getrow(&in_hdr, rows0 );
rle_getrow(&in_hdr, rows1 );
for (chan = RLE_ALPHA; chan < in_hdr.ncolors; chan++)
{
ptr0 = &(rows0[chan][in_hdr.xmin]);
ptr1 = &(rows1[chan][in_hdr.xmin]);
ptrout = rowsout[chan];
alphptr = rowsout[RLE_ALPHA];
/*
* If we don't start out with an alpha channel in the
* original image, then we want to fake one up. This
* works by counting the number of non-zero pixels in the
* R, G and B channels. We set bits in the alpha channel
* for the non-zero pixels found, then use bit_count to
* convert this to reasonable coverage values.
*/
if ((chan == RLE_ALPHA) && (!in_hdr.alpha))
{
bzero(alphptr, new_xlen);
}
else for( i = 0; i < new_xlen; i++)
{
if (!in_hdr.alpha)
{
*alphptr |= (*ptr0 ? 1 : 0) | (ptr0[1] ? 2 : 0) |
(*ptr1 ? 4 : 0) | (ptr1[1] ? 8 : 0);
/* calc fake alpha from bit count */
if (chan == (in_hdr.ncolors - 1))
*alphptr = bit_count[*alphptr];
alphptr++;
}
A = (int) *ptr0++ + (int) *ptr0++ +
(int) *ptr1++ + (int) *ptr1++;
*ptrout++ = (rle_pixel) (A / 4);
}
}
rle_putrow( rowsout, new_xlen, &out_hdr );
}
rle_puteof( &out_hdr );
rle_row_free( &in_hdr, rows0 );
rle_row_free( &in_hdr, rows1 );
rle_row_free( &out_hdr, rowsout );
}
if ( rle_cnt == 0 || (rle_err != RLE_EOF && rle_err != RLE_EMPTY) )
rle_get_error( rle_err, cmd, infname );
exit( 0 );
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.