This is crop.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.
*/
/*
* crop.c - Crop an image to the given size.
*
* Author: Rod Bogart & John W. Peterson
* Computer Science Dept.
* University of Utah
* Date: Mon Jun 23 1986
* Copyright (c) 1986, University of Utah
*
*/
#ifndef lint
static char rcs_ident[] = "$Header: /usr/users/spencer/src/urt/tools/RCS/crop.c,v 3.0 90/08/03 15:21:45 spencer Exp $";
#endif
#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 */
extern void rle_box();
int pos_box_vals();
void
main(argc, argv)
int argc;
char *argv[];
{
rle_pixel **scanline, **rows, **outrows;
int xlen, i, j;
int xmin = -1, ymin = -1, xmax = -1, ymax = -1;
char *infilename = NULL, *out_fname = NULL;
FILE *outfile = stdout;
int oflag = 0, bflag = 0, bottom_row;
rle_hdr in_hdr, out_hdr;
int rle_cnt, rle_err;
long start;
if (scanargs( argc, argv,
"% b%- xmin%d ymin%d xmax%d ymax%d o%-outfile!s infile%s",
&bflag, &xmin, &ymin, &xmax, &ymax, &oflag, &out_fname,
&infilename ) == 0)
{
exit(-1);
}
in_hdr.rle_file = rle_open_f( cmd_name( argv ), infilename, "r" );
for ( rle_cnt = 0; ; rle_cnt++ )
{
start = ftell( in_hdr.rle_file );
if ( (rle_err = rle_get_setup( &in_hdr )) != RLE_SUCCESS )
break;
out_hdr = in_hdr;
rle_addhist( argv, &in_hdr, &out_hdr );
if ( rle_cnt == 0 )
outfile = rle_open_f( cmd_name( argv ), out_fname, "w" );
out_hdr.rle_file = outfile;
/* If bflag, then pre-scan file to get bounding box. */
if (bflag != 0)
{
if (xmin == -1 && start >= 0)
{
/* Common code with rlebox program. */
rle_box( &in_hdr, &xmin, &xmax, &ymin, &ymax );
/* Rewind and start over. */
fseek( in_hdr.rle_file, start, 0 );
rle_get_setup( &in_hdr ); /* Should work fine this time. */
}
else
{
/* error message and exit: -b flag and box values or piped input */
if (xmin != -1)
fprintf( stderr,
"%s: You cannot specify the -b flag and box values together\n",
cmd_name( argv ) );
else
fprintf( stderr,
"%s: No piped input allowed with the -b flag\n",
cmd_name( argv ) );
exit(-1);
}
}
else if ( pos_box_vals( xmin, ymin, xmax, ymax ) != 0 )
{
fprintf( stderr,
"%s: You must specify either all the box coordinates or the -b flag\n",
cmd_name( argv ) );
exit(-1);
}
xlen = xmax - xmin + 1;
if ( (xmin > xmax) || (ymin > ymax) )
{
fprintf( stderr, "%s: Illegal size: %d, %d to %d, %d\n",
cmd_name( argv ), xmin, ymin, xmax, ymax );
exit(-1);
}
/* should check for disjoint regions */
out_hdr.xmin = xmin;
out_hdr.ymin = ymin;
out_hdr.xmax = xmax;
out_hdr.ymax = ymax;
rle_put_setup( &out_hdr );
if (out_hdr.xmax > in_hdr.xmax)
{
if (rle_row_alloc( &out_hdr, &scanline ))
fprintf( stderr, "%s: Ran out of malloc space\n",
cmd_name( argv ) );
}
else
{
if (rle_row_alloc( &in_hdr, &scanline ))
fprintf( stderr, "%s: Ran out of malloc space\n",
cmd_name( argv ) );
}
if (!(rows = (rle_pixel **)
malloc((in_hdr.ncolors + in_hdr.alpha)
* sizeof( rle_pixel * ))))
fprintf( stderr, "%s: Ran out of malloc space\n",
cmd_name( argv ) );
if (!(outrows = (rle_pixel **)
malloc((in_hdr.ncolors + in_hdr.alpha)
* sizeof( rle_pixel * ))))
fprintf( stderr, "%s: Ran out of malloc space\n",
cmd_name( argv ) );
if ( in_hdr.alpha )
{
rows++; /* So alpha is rows[-1] */
outrows++;
}
for( i = -in_hdr.alpha; i < in_hdr.ncolors; i++ )
rows[i] = scanline[i];
for( i = -in_hdr.alpha; i < in_hdr.ncolors; i++ )
outrows[i] = &scanline[i][xmin];
bottom_row = in_hdr.ymin;
if (in_hdr.ymin > out_hdr.ymin)
{
/* Output blank scanlines if crop region is larger than data */
rle_skiprow(&out_hdr, in_hdr.ymin - out_hdr.ymin);
bottom_row = in_hdr.ymin;
}
else
if (in_hdr.ymin < out_hdr.ymin)
{
/* Read past extra lower scanlines */
for (i = in_hdr.ymin; i < out_hdr.ymin; i++)
rle_getrow(&in_hdr, rows );
bottom_row = out_hdr.ymin;
}
/* Read in image */
for (j = bottom_row; j <= out_hdr.ymax; j++)
{
rle_getrow(&in_hdr, rows );
rle_putrow( outrows, xlen, &out_hdr );
}
rle_puteof( &out_hdr );
/* Skip extra upper scanlines. */
while ( rle_getskip( &in_hdr ) != 32768 )
;
/* Clean up for next time around. */
rle_row_free( (out_hdr.xmax > in_hdr.xmax) ? &out_hdr : &in_hdr,
scanline );
free( rows - in_hdr.alpha );
free( outrows - in_hdr.alpha );
if ( bflag )
xmin = xmax = ymin = ymax = -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 ), infilename );
exit( 0 );
}
/* Return 0 if all parameters >= 0, else -1. */
int
pos_box_vals(x1, y1, x2, y2)
int x1, y1, x2, y2;
{
if ((x1 < 0) || (y1 < 0) || (x2 < 0) || (y2 < 0))
return -1;
else
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.