This is tobw.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.
*/
/*
* tobw.c - Filter to change an RLE file to B&W.
*
* Author: Spencer W. Thomas
* Computer Science Dept.
* University of Utah
* Date: Tue Feb 25 1986
* Copyright (c) 1986, University of Utah
*
*/
#ifndef lint
static char rcs_ident[] = "$Header: /usr/users/spencer/src/urt/tools/RCS/tobw.c,v 3.0 90/08/03 15:24:09 spencer Exp $";
#endif
#include <stdio.h>
#include <math.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 */
/*****************************************************************
* TAG( main )
*
* Usage: tobw [-t] [-o outfile] [infile]
*
* Inputs:
* -t: If specified, output a 3-channel image (all three
* the same).
* infile: Input (color) RLE file. Stdin used if not
* specified.
* Outputs:
* outfile: Output (black & white) RLE file. Stdout used
* if not specified.
* Assumptions:
* [None]
* Algorithm:
* [None]
*/
void
main( argc, argv )
int argc;
char **argv;
{
char * infname = NULL, * outfname = NULL;
FILE * outfile = stdout;
int oflag = 0, tflag = 0, y, nrow;
rle_hdr out_hdr;
unsigned char ** scan, *outscan[4];
unsigned char * buffer;
int rle_cnt, rle_err;
if ( scanargs( argc, argv, "% t%- o%-outfile!s infile%s",
&tflag, &oflag, &outfname, &infname ) == 0 )
exit( 1 );
rle_dflt_hdr.rle_file = rle_open_f(cmd_name( argv ), infname, "r");
for ( rle_cnt = 0;
(rle_err = rle_get_setup( &rle_dflt_hdr )) == RLE_SUCCESS;
rle_cnt++ )
{
if ( rle_dflt_hdr.ncolors == 1 )
{
fprintf( stderr, "%s: %s is already black & white\n",
cmd_name( argv ), infname ? infname : "stdin" );
exit( 1 );
}
if ( rle_dflt_hdr.ncolors < 3 )
{
fprintf( stderr, "%s: %s is not RGB",
cmd_name( argv ), infname ? infname : "stdin" );
exit( 1 );
}
if ( rle_dflt_hdr.alpha )
RLE_SET_BIT( rle_dflt_hdr, RLE_ALPHA );
out_hdr = rle_dflt_hdr;
if ( rle_cnt == 0 )
outfile = rle_open_f(cmd_name( argv ), outfname, "w");
rle_dflt_hdr.xmax -= rle_dflt_hdr.xmin;
rle_dflt_hdr.xmin = 0;
nrow = rle_dflt_hdr.xmax + 1;
buffer = (unsigned char *)malloc( nrow );
rle_row_alloc( &rle_dflt_hdr, &scan );
if ( rle_dflt_hdr.alpha )
{
outscan[0] = scan[-1];
}
outscan[1] = buffer;
/* If 3 channel output, reference the line 3 times */
if ( tflag )
outscan[2] = outscan[3] = buffer;
if ( ! tflag )
out_hdr.ncolors = 1;
else
out_hdr.ncolors = 3;
if ( rle_dflt_hdr.background != NULL )
{
rle_pixel r, g, b, o;
out_hdr.bg_color = (int *)malloc( sizeof( int ) );
r = rle_dflt_hdr.bg_color[0];
g = rle_dflt_hdr.bg_color[1];
b = rle_dflt_hdr.bg_color[2];
rgb_to_bw( &r, &g, &b, &o, 1 );
out_hdr.bg_color[0] = o;
}
rle_addhist( argv, &rle_dflt_hdr, &out_hdr );
out_hdr.rle_file = outfile;
rle_put_setup( &out_hdr );
while ( (y = rle_getrow( &rle_dflt_hdr, scan )) <=
rle_dflt_hdr.ymax )
{
rgb_to_bw( scan[0], scan[1], scan[2], buffer, nrow );
rle_putrow( &outscan[1], nrow, &out_hdr );
}
rle_puteof( &out_hdr );
rle_row_free( &rle_dflt_hdr, scan );
}
/* 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.