home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / netpbma.zip / pgm / pgmoil.c < prev    next >
C/C++ Source or Header  |  1993-10-04  |  2KB  |  96 lines

  1. /* pgmoil.c - read a portable graymap and turn into an oil painting
  2. **
  3. ** Copyright (C) 1990 by Wilson Bent (whb@hoh-2.att.com)
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include "pgm.h"
  15.  
  16. static int hist[PGM_MAXMAXVAL+1];
  17.  
  18. int
  19. main( argc, argv )
  20.     int argc;
  21.     char* argv[];
  22.     {
  23.     FILE* ifp;
  24.     gray midval, maxval;
  25.     gray** grays;
  26.     gray* grayrow;
  27.     int argn, rows, n, cols, row;
  28.     register int col, drow, dcol;
  29.     int i;
  30.     char* usage = "[-n <n>] [pgmfile]";
  31.  
  32.  
  33.     pgm_init( &argc, argv );
  34.  
  35.     argn = 1;
  36.     n = 3;        /* DEFAULT VALUE */
  37.  
  38.     /* Check for flags. */
  39.     if ( argn < argc && argv[argn][0] == '-' )
  40.     {
  41.     if ( argv[argn][1] == 'n' )
  42.         {
  43.         ++argn;
  44.         if ( argn == argc || sscanf( argv[argn], "%d", &n ) != 1 )
  45.         pm_usage( usage );
  46.         }
  47.     else
  48.         pm_usage( usage );
  49.     ++argn;
  50.     }
  51.  
  52.     if ( argn < argc )
  53.     {
  54.     ifp = pm_openr( argv[argn] );
  55.     ++argn;
  56.     }
  57.     else
  58.     ifp = stdin;
  59.  
  60.     if ( argn != argc )
  61.     pm_usage( usage );
  62.  
  63.     grays = pgm_readpgm( ifp, &cols, &rows, &maxval );
  64.     pm_close( ifp );
  65.  
  66.     pgm_writepgminit( stdout, cols, rows, maxval, 0 );
  67.     grayrow = pgm_allocrow( cols );
  68.  
  69.     for ( row = 0; row < rows; ++row )
  70.     {
  71.     for ( col = 0; col < cols; ++col )
  72.         {
  73.         for ( i = 0; i <= maxval; ++i )
  74.         hist[i] = 0;
  75.  
  76.         for ( drow = row - n; drow <= row + n; ++drow )
  77.         if ( drow >= 0 && drow < rows )
  78.             for ( dcol = col - n; dcol <= col + n; ++dcol )
  79.             if ( dcol >= 0 && dcol < cols )
  80.                 ++hist[ (int) (grays[drow][dcol]) ];
  81.  
  82.         for ( drow = dcol = 0; dcol < maxval; ++dcol )
  83.         if ( hist[dcol] > drow )
  84.             {
  85.             drow = hist[dcol];
  86.             midval = dcol;
  87.             }
  88.         grayrow[col] = midval;
  89.         }
  90.     pgm_writepgmrow( stdout, grayrow, cols, maxval, 0 );
  91.     }
  92.  
  93.     pm_close( stdout );
  94.     exit( 0 );
  95.     }
  96.