This is pgmramp.c in view mode; [Download] [Up]
/* pgmramp.c - generate a grayscale ramp ** ** 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 "pgm.h" int main( argc, argv ) int argc; char *argv[]; { gray *grayrow; register gray *gP; int rows, cols, rowso2, colso2, row; register int col; int ramptype; #define RT_LR 1 #define RT_TB 2 #define RT_RECT 3 #define RT_ELLIP 4 char *usage = "-lr|-tb|-rectangle|-ellipse <width> <height>"; pgm_init( &argc, argv ); if ( argc != 4 ) pm_usage( usage ); if ( pm_keymatch( argv[1], "-lr", 2 ) ) ramptype = RT_LR; else if ( pm_keymatch( argv[1], "-tb", 2 ) ) ramptype = RT_TB; else if ( pm_keymatch( argv[1], "-rectangle", 2 ) ) ramptype = RT_RECT; else if ( pm_keymatch( argv[1], "-ellipse", 2 ) ) ramptype = RT_ELLIP; else pm_usage( usage ); if ( sscanf( argv[2], "%d", &cols ) != 1 ) pm_usage( usage ); if ( sscanf( argv[3], "%d", &rows ) != 1 ) pm_usage( usage ); colso2 = cols / 2; rowso2 = rows / 2; pgm_writepgminit( stdout, cols, rows, PGM_MAXMAXVAL, 0 ); grayrow = pgm_allocrow( cols ); for ( row = 0; row < rows; ++row ) { for ( col = 0, gP = grayrow; col < cols; ++col, ++gP ) { switch ( ramptype ) { case RT_LR: *gP = col * PGM_MAXMAXVAL / ((cols == 1) ? 1 : (cols - 1)); break; case RT_TB: *gP = row * PGM_MAXMAXVAL / ((rows == 1) ? 1 : (rows - 1)); break; case RT_RECT: { float r, c; r = abs( rowso2 - row ) / (float) rowso2; c = abs( colso2 - col ) / (float) colso2; *gP = PGM_MAXMAXVAL - ( r + c ) / 2.0 * PGM_MAXMAXVAL; } break; case RT_ELLIP: { float r, c, v; r = abs( rowso2 - row ) / (float) rowso2; c = abs( colso2 - col ) / (float) colso2; v = r * r + c * c; if ( v < 0.0 ) v = 0.0; else if ( v > 1.0 ) v = 1.0; *gP = PGM_MAXMAXVAL - v * PGM_MAXMAXVAL; } break; default: pm_error( "can't happen" ); } } pgm_writepgmrow( stdout, grayrow, cols, PGM_MAXMAXVAL, 0 ); } 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.