This is rlepatch.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. */ /* * rlepatch.c - Patch images over a larger image. * * Author: John W. Peterson * Computer Science Dept. * University of Utah * Date: Sun Nov 29 1987 * Copyright (c) 1987, University of Utah * * This was a quick hack. It should be changed to use the "raw" * routines someday - this would run MUCH faster for sparse patches. */ #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 */ #define CHECK_MALLOC( ptr ) \ { if (! (ptr)) {fprintf( stderr, "%s: Unable to alloc memory\n", \ cmd_name( argv ) ); exit(-2);}} #define IN_WINDOW(y,wind) ((y >= wind.ymin) && (y <= wind.ymax)) void main( argc, argv ) int argc; char **argv; { rle_hdr im_hdr, *patch_hdr, out_hdr; CONST_DECL char *imfilename = NULL, *outfilename = NULL; CONST_DECL char **patchnames; FILE *outfile = stdout; rle_pixel ** im_rows, **patch_rows, ** outrows; int stdin_used = 0; int patches = 0, oflag = 0, i, y, c, xlen, width; int rle_cnt, rle_err; if (! scanargs( argc, argv, "% o%-outfile!s infile!s patchfiles%*s", &oflag, &outfilename, &imfilename, &patches, &patchnames )) exit( -1 ); patch_hdr = (rle_hdr *) malloc( sizeof( rle_hdr ) * patches ); CHECK_MALLOC( patch_hdr ); /* Setup the main image data structures. */ im_hdr.rle_file = rle_open_f( cmd_name( argv ), imfilename, "r" ); if ( im_hdr.rle_file == stdin ) { imfilename = "Standard input"; /* For error messages */ stdin_used++; } for( i = 0; i < patches; i++ ) { patch_hdr[i].rle_file = rle_open_f( cmd_name( argv ), patchnames[i], "r" ); if ( patch_hdr[i].rle_file == stdin ) { patchnames[i] = "Standard input"; if ( stdin_used ) { fprintf(stderr, "%s: Only use stdin (-) once.\n", cmd_name( argv )); exit(-1); } stdin_used++; } } for ( rle_cnt = 0; (rle_err = rle_get_setup( &im_hdr )) == RLE_SUCCESS; rle_cnt++ ) { /* Get the patch files set up */ for( i = 0; i < patches; i++ ) { rle_get_setup_ok( &patch_hdr[i], cmd_name( argv ), patchnames[i] ); /* Sanity checks. */ if ((patch_hdr[i].xmin < im_hdr.xmin) || (patch_hdr[i].xmax > im_hdr.xmax) || (patch_hdr[i].ymin < im_hdr.ymin) || (patch_hdr[i].ymax > im_hdr.ymax)) { fprintf( stderr, "%s: file %s is outside %s\n", cmd_name( argv ), patchnames[i], imfilename ); exit( -2 ); } if ((patch_hdr[i].ncolors != im_hdr.ncolors) || (patch_hdr[i].alpha != im_hdr.alpha)) { fprintf( stderr, "%s: file %s doesn't have the same channels as %s\n", cmd_name( argv ), patchnames[i], imfilename ); exit(-2); } } if (rle_row_alloc( &im_hdr, &im_rows ) || rle_row_alloc( &im_hdr, &patch_rows )) CHECK_MALLOC( 0 ); /* Setup output */ out_hdr = im_hdr; if ( rle_cnt == 0 ) outfile = rle_open_f( cmd_name( argv ), outfilename, "w" ); out_hdr.rle_file = outfile; rle_addhist( argv, &im_hdr, &out_hdr ); rle_put_setup( &out_hdr ); /* * Allocate pointers to the output rows. Note that rle_putrow * expects the pointers to start at xmin, instead of at zero * like rle_getrow (Weird Spencerism). */ outrows = (rle_pixel**) malloc( sizeof( rle_pixel** ) * (im_hdr.alpha + im_hdr.ncolors)); CHECK_MALLOC( outrows ); if (im_hdr.alpha) outrows++; /* Put alpha at -1 index */ xlen = out_hdr.xmax - out_hdr.xmin + 1; for( i = -im_hdr.alpha; i < im_hdr.ncolors; i++ ) outrows[i] = &(im_rows[i][im_hdr.xmin]); /* Process the images. */ for (y = im_hdr.ymin; y <= im_hdr.ymax; y++) { rle_getrow( &im_hdr, im_rows ); for (i = 0; i < patches; i++) { if (IN_WINDOW( y, patch_hdr[i])) { rle_getrow( &(patch_hdr[i]), patch_rows ); width = patch_hdr[i].xmax - patch_hdr[i].xmin + 1; for( c = -im_hdr.alpha; c < im_hdr.ncolors; c++) bcopy( &(patch_rows[c][patch_hdr[i].xmin]), &(im_rows[c][patch_hdr[i].xmin]), width ); } } rle_putrow( outrows, xlen, &out_hdr ); } rle_puteof( &out_hdr ); /* Release memory. */ rle_row_free( &im_hdr, im_rows ); rle_row_free( &im_hdr, patch_rows ); if ( im_hdr.alpha ) outrows--; free( outrows ); } exit( 0 ); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.