This is pgmtorle.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.
*/
/*
* pgmtorle - A program which will convert pbmplus/pgm images
* to Utah's "rle" image format.
*
* Author: Wesley C. Barris
* AHPCRC
* Minnesota Supercomputer Center, Inc.
* Date: Fri July 20 1990
* Copyright (c) 1990 Wesley C. Barris
*/
/*-----------------------------------------------------
* System includes.
*/
#include <stdio.h>
#include <pgm.h>
#include <rle.h>
#ifdef USE_STDLIB_H
#include <stdlib.h>
#else
#ifdef USE_STRING_H
#include <string.h>
#else
#include <strings.h>
#define strrchr rindex
#endif
#ifdef VOID_STAR
extern void *malloc();
#else
extern char *malloc();
#endif
extern void free();
#endif /* USE_STDLIB_H */
#define VPRINTF if (verbose || header) fprintf
typedef unsigned char U_CHAR;
/*
* Global variables.
*/
FILE *fp;
int format;
int width, height;
int verbose = 0, header = 0, do_alpha = 0;
gray maxval;
/*-----------------------------------------------------------------------------
* Read the Wavefront image file header.
*/
void read_pgm_header()
{
pgm_readpgminit(fp, &width, &height, &maxval, &format);
VPRINTF(stderr, "Image type: 8 bit grayscale\n");
VPRINTF(stderr, "Full image: %dx%d\n", width, height);
VPRINTF(stderr, "Maxval: %d\n", maxval);
if (do_alpha)
VPRINTF(stderr, "Computing alpha channel...\n");
}
/*-----------------------------------------------------------------------------
* Write the rle image file header.
*/
void write_rle_header()
{
rle_dflt_hdr.xmin = 0;
rle_dflt_hdr.xmax = width-1;
rle_dflt_hdr.ymin = 0;
rle_dflt_hdr.ymax = height-1;
rle_dflt_hdr.ncolors = 1;
rle_dflt_hdr.background = 0;
RLE_SET_BIT(rle_dflt_hdr, RLE_RED);
if (do_alpha) {
rle_dflt_hdr.alpha = 1;
RLE_SET_BIT(rle_dflt_hdr, RLE_ALPHA);
}
rle_put_setup(&rle_dflt_hdr);
}
/*-----------------------------------------------------------------------------
* Write the rle data portion of the file.
*/
void write_rle_data()
{
register int x;
register int scan;
register gray *grayrow;
rle_pixel **scanline;
/*
* Allocate some memory.
*/
grayrow = pgm_allocrow(width);
if (rle_row_alloc(&rle_dflt_hdr, &scanline)) {
fprintf(stderr, "Unable to malloc space for pixels\n");
exit(-1);
}
/*
* Loop through the pgm files image window, write blank lines outside
* active window.
*/
for (scan = 0; scan < height; scan++) {
pgm_readpgmrow(fp, grayrow, width, maxval, format);
scanline[RLE_RED] = grayrow;
if (do_alpha)
for (x = 0; x < width; x++)
scanline[RLE_ALPHA][x] = (scanline[RLE_RED][x] ? 255 : 0);
rle_putrow(scanline, width, &rle_dflt_hdr);
}
VPRINTF(stderr, "Done -- write oef to RLE data.\n");
rle_puteof(&rle_dflt_hdr);
/*
* Free up some stuff.
*/
}
/*-----------------------------------------------------------------------------
* Convert an Wavefront image file into an rle image file.
*/
int
main(argc, argv)
int argc;
char **argv;
{
int oflag = 0;
char *periodP, *pgmname = 0, *outname = 0;
static char filename[BUFSIZ];
/*
* Get those options.
*/
if (!scanargs(argc,argv,
"% v%- h%- a%- o%-outfile!s infile.pgm%s",
&verbose,
&header,
&do_alpha,
&oflag, &outname,
&pgmname))
exit(-1);
/*
* Open the file.
*/
if (pgmname == NULL) {
strcpy(filename, "stdin");
fp = stdin;
}
else {
periodP = strrchr(pgmname, '.');
strcpy(filename, pgmname);
if (periodP) {
if (strcmp(periodP, ".pgm")) /* does not end in pgm */
strcat(filename, ".pgm");
}
else /* no ext -- add one */
strcat(filename, ".pgm");
if (!(fp = fopen(filename, "r"))) {
fprintf(stderr, "Cannot open %s for reading.\n", filename);
exit(-1);
}
}
/*
* Read the Wavefront file file header.
*/
read_pgm_header();
if (header)
exit(0);
/*
* Write the rle file header.
*/
rle_dflt_hdr.rle_file = rle_open_f( cmd_name( argv ), outname, "w" );
rle_addhist(argv, (rle_hdr *)NULL, &rle_dflt_hdr);
write_rle_header();
/*
* Write the rle file data.
*/
write_rle_data();
fclose(fp);
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.