This is rletops.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.
*/
/*
* rletops.c - Convert RLE to postscript file.
*
* Author: Rod Bogart & John W. Peterson
* Computer Science Dept.
* University of Utah
* Date: Tue Nov 4 1986
* Copyright (c) 1986 Rod Bogart
*
* Modified by: Gregg Townsend
* Department of Computer Science
* University of Arizona
* Date: June 22, 1990
* Changes: 50% speedup using putc(), add -C option, translate to page ctr
*
* Based on "tobw.c" by Spencer Thomas, and
* "rps" by Marc Majka (UBC Vision lab)
*
* EPSF code from Mike Zyda (Naval Postgraduate School)
*
* Options:
* -C - Generate color PostScript (instead of monochrome)
* -h X - Image height in inches (default 3", width is found via aspect & size)
* -s - Scribe mode: don't generate "showpage", and default center is 3.25
* -c X - Center image about X inches on the page (or margin if -s is on).
* -a - Aspect ratio of image (default 1.0)
*
* If an input file isn't specified, it reads from stdin. An output file
* can be specified with -o (otherwise it writes to stdout).
*/
#ifndef lint
static char rcs_ident[] = "$Id: rletops.c,v 3.0 90/08/03 15:18:15 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 */
void prologue(), puthexpix(), epilogue();
static int gencps = 0; /* generate color PostScript? */
void
main( argc, argv )
int argc;
char **argv;
{
char *infname = NULL,
*outfname = NULL;
FILE *outfile;
int sflag = 0,
oflag = 0,
cflag = 0;
int add_extra_white_line = 0;
float heightinch = 3.0,
center = 3.25,
aspect = 1.0;
int y, nrow, nscan, i, pix, dummy;
float x1, y1, x2, y2, widthinch;
unsigned char ** scan;
unsigned char * buffer;
if ( scanargs( argc, argv,
"% C%- s%- h%-height!f c%-center!f a%-aspect!f o%-outfile!s infile%s",
&gencps, &sflag, &dummy, &heightinch, &cflag, ¢er, &dummy,
&aspect, &oflag, &outfname, &infname ) == 0 )
exit( 1 );
/* Open RLE file and get header information */
rle_dflt_hdr.rle_file = rle_open_f("rletops", infname, "r");
rle_get_setup_ok( &rle_dflt_hdr, "rletops", infname );
if ( ( rle_dflt_hdr.ncolors != 3 ) && ( rle_dflt_hdr.ncolors != 1))
{
fprintf( stderr, "%s is not RGB or b&w image",
infname ? infname : "stdin" );
exit( 0 );
}
if ( rle_dflt_hdr.ncolors == 1 )
gencps = 0; /* can't have color out if no color in! */
outfile = rle_open_f("rletops", outfname, "w");
/*
* Spencer trick: save space by sliding the input image over to the
* left margin.
*/
rle_dflt_hdr.xmax -= rle_dflt_hdr.xmin;
rle_dflt_hdr.xmin = 0;
nrow = rle_dflt_hdr.xmax + 1;
nscan = (rle_dflt_hdr.ymax - rle_dflt_hdr.ymin + 1);
/* The laserwriters throw out files with an odd number of scanlines! */
if (nscan % 2)
{
nscan++;
add_extra_white_line = 1;
}
/* Allocate scanline memory */
buffer = (unsigned char *)malloc( nrow );
rle_row_alloc( &rle_dflt_hdr, &scan );
/* Calculate image size and placement */
widthinch = (float) nrow * heightinch * aspect / (float) nscan;
if (sflag)
{
x1 = center - widthinch / 2.0;
y1 = 0.0;
}
else
{
if (cflag)
x1 = center - widthinch / 2.0;
else
/* center on whole page */
x1 = 4.25 - widthinch / 2.0;
/* place top edge one inch from top of page */
y1 = 11.0 - 1.0 - heightinch;
}
x2 = x1 + widthinch;
y2 = y1 + heightinch;
prologue(outfile,sflag,nscan,nrow,x1,y1,x2,y2);
while ( (y = rle_getrow( &rle_dflt_hdr, scan )) <=
rle_dflt_hdr.ymax )
{
if (gencps) {
/* generate a color line */
for(pix = 0; pix < nrow; pix ++) {
puthexpix(outfile,scan[0][pix]);
puthexpix(outfile,scan[1][pix]);
puthexpix(outfile,scan[2][pix]);
}
} else {
/* generate a monochrome line */
if (rle_dflt_hdr.ncolors == 1)
buffer = scan[0];
else
rgb_to_bw( scan[0], scan[1], scan[2], buffer, nrow );
for(pix = 0; pix < nrow; pix ++)
puthexpix(outfile,buffer[pix]);
}
}
if (add_extra_white_line)
for(i = 0; i < (gencps ? 3 : 1); i++)
for(pix = 0; pix < nrow; pix ++)
puthexpix(outfile,255);
epilogue(outfile, sflag);
exit( 0 );
}
void
prologue(outfile,scribe_mode,nr,nc,x1,y1,x2,y2)
FILE *outfile;
int scribe_mode;
int nr,nc;
float x1,y1,x2,y2;
{
fprintf(outfile,"%%!\n");
fprintf(outfile, "%%BoundingBox: %d %d %d %d\n",
(int)(x1 * 72), (int)(y1 * 72),
(int)(x2 * 72), (int)(y2 * 72));
fprintf(outfile, "%%EndComments\n");
fprintf(outfile,"gsave\n");
if (! scribe_mode)
fprintf(outfile,"initgraphics\n");
fprintf(outfile,"72 72 scale\n");
fprintf(outfile,"/imline %d string def\n",nc*2*(gencps?3:1));
fprintf(outfile,"/drawimage {\n");
fprintf(outfile," %d %d 8\n",nc,nr);
fprintf(outfile," [%d 0 0 %d 0 %d]\n",nc,-1*nr,nr);
fprintf(outfile," { currentfile imline readhexstring pop } ");
if (gencps)
fprintf(outfile,"false 3 colorimage\n");
else
fprintf(outfile,"image\n");
fprintf(outfile,"} def\n");
fprintf(outfile,"%f %f translate\n",x1,y2);
fprintf(outfile,"%f %f scale\n",x2-x1,y1-y2);
fprintf(outfile,"drawimage\n");
}
void
epilogue(outfile, scribemode)
FILE *outfile;
int scribemode;
{
fprintf(outfile,"\n");
if (!scribemode)
fprintf(outfile,"showpage\n");
fprintf(outfile,"grestore\n");
}
void
puthexpix(outfile,p)
FILE *outfile;
unsigned char p;
{
static npixo = 0;
static char tohex[] = "0123456789ABCDEF";
putc(tohex[(p>>4)&0xF],outfile);
putc(tohex[p&0xF],outfile);
npixo += 1;
if (npixo >= 32) {
putc('\n',outfile);
npixo = 0;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.