This is rawtopgm.c in view mode; [Download] [Up]
/* rawtopgm.c - convert raw grayscale bytes into a portable graymap ** ** Copyright (C) 1989 by Jef Poskanzer. ** ** Permission to use, copy, modify, and distribute this software and its ** documentation for any purpose and without fee is hereby granted, provided ** that the above copyright notice appear in all copies and that both that ** copyright notice and this permission notice appear in supporting ** documentation. This software is provided "as is" without express or ** implied warranty. */ #include <math.h> #include "pgm.h" int main( argc, argv ) int argc; char* argv[]; { FILE* ifp; gray* grayrow; register gray* gP; int argn, headerskip, row, i; float rowskip, toskip; register int col, val; int rows=0, cols=0, topbottom=0; char* buf = NULL; char* pos; long nread = 0; char* usage = "[-headerskip N] [-rowskip N] [-tb|-topbottom] [<width> <height>] [rawfile]"; /* double atof(); should be declared by math.h */ pgm_init( &argc, argv ); argn = 1; headerskip = 0; rowskip = 0.0; while ( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' ) { if ( pm_keymatch( argv[argn], "-headerskip", 2 ) ) { ++argn; if ( argn >= argc ) pm_usage( usage ); headerskip = atoi( argv[argn] ); } else if ( pm_keymatch( argv[argn], "-rowskip", 2 ) ) { ++argn; if ( argn >= argc ) pm_usage( usage ); rowskip = atof( argv[argn] ); } else if ( pm_keymatch( argv[argn], "-tb", 2 ) || pm_keymatch( argv[argn], "-topbottom", 2 )) { topbottom=1; } else pm_usage( usage ); ++argn; } if ( argn + 2 <= argc ) { /* Read cols and rows */ cols = atoi( argv[argn++] ); rows = atoi( argv[argn++] ); if ( cols <= 0 || rows <= 0 ) pm_usage( usage ); } if ( argn < argc ) { ifp = pm_openr( argv[argn] ); ++argn; } else ifp = stdin; if ( argn != argc ) pm_usage( usage ); if (cols==0 || topbottom) { buf = pm_read_unknown_size( ifp, &nread ); if (cols==0) { rows = cols = (int) sqrt((double) nread); if (rows*cols+headerskip != nread) pm_error( "Not a quadratic input picture" ); pos = buf; pm_message( "Image size: %d cols, %d rows", cols, rows); } } for ( i = 0; i < headerskip; ++i ) if (nread) pos++; else { val = getc( ifp ); if ( val == EOF ) pm_error( "EOF / read error" ); } toskip = 0.00001; pgm_writepgminit( stdout, cols, rows, (gray) 255, 0 ); grayrow = pgm_allocrow( cols ); for ( row = 0; row < rows; ++row) { if (topbottom) pos = buf + (rows-row-1) * cols + headerskip; for ( col = 0, gP = grayrow; col < cols; ++col ) if (nread) { *gP++ = *pos++; } else { val = getc( ifp ); if ( val == EOF ) pm_error( "EOF / read error" ); *gP++ = val; } for ( toskip += rowskip; toskip >= 1.0; toskip -= 1.0 ) if (nread) { pos++; } else { val = getc( ifp ); if ( val == EOF ) pm_error( "EOF / read error" ); } pgm_writepgmrow( stdout, grayrow, cols, (gray) 255, 0 ); } if (nread) free(buf); pm_close( ifp ); pm_close( stdout ); exit( 0 ); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.