home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 309.lha / PBM_PLUS / pnm / pnmflip.c < prev    next >
C/C++ Source or Header  |  1980-12-04  |  5KB  |  188 lines

  1. /* pnmflip.c - perform one or more flip operations on a portable anymap
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  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. #ifdef    SYSV
  15. #include <string.h>
  16. #else    SYSV
  17. #include <strings.h>
  18. #endif    SYSV
  19. #include "pnm.h"
  20.  
  21. #define max(a,b) ((a) > (b) ? (a) : (b))
  22.  
  23. main( argc, argv )
  24. int argc;
  25. char *argv[];
  26.     {
  27.     FILE *ifd;
  28.     xel **xels, **transpose();
  29.     void leftright(), topbottom();
  30.     int argn, rows, cols, format;
  31.     xelval maxval;
  32.     char *usage = "[-leftright|-lr] [-topbottom|-tb] [-transpose|-xy]\n            [-rotate90|-r90|-ccw] [-rotate270|r270|-cw]\n            [-rotate180|-r180] [pnmfile]";
  33.  
  34.     pm_progname = argv[0];
  35.  
  36.     argn = 1;
  37.  
  38.     /* Just check the validity of arguments here. */
  39.     while ( argn < argc && argv[argn][0] == '-' )
  40.     {
  41.     if ( strncmp(argv[argn],"-lr",max(strlen(argv[argn]),2)) == 0 ||
  42.          strncmp(argv[argn],"-leftright",max(strlen(argv[argn]),2)) == 0 )
  43.         { }
  44.     else if ( strncmp(argv[argn],"-tb",max(strlen(argv[argn]),3)) == 0 ||
  45.          strncmp(argv[argn],"-topbottom",max(strlen(argv[argn]),3)) == 0 )
  46.         { }
  47.     else if ( strncmp(argv[argn],"-xy",max(strlen(argv[argn]),2)) == 0 ||
  48.          strncmp(argv[argn],"-transpose",max(strlen(argv[argn]),3)) == 0 )
  49.         { }
  50.     else if ( strncmp(argv[argn],"-r90",max(strlen(argv[argn]),3)) == 0 ||
  51.          strncmp(argv[argn],"-rotate90",max(strlen(argv[argn]),8)) == 0 ||
  52.          strncmp(argv[argn],"-ccw",max(strlen(argv[argn]),3)) == 0 )
  53.         { }
  54.     else if ( strncmp(argv[argn],"-r270",max(strlen(argv[argn]),3)) == 0 ||
  55.          strncmp(argv[argn],"-rotate270",max(strlen(argv[argn]),8)) == 0 ||
  56.          strncmp(argv[argn],"-cw",max(strlen(argv[argn]),3)) == 0 )
  57.         { }
  58.     else if ( strncmp(argv[argn],"-r180",max(strlen(argv[argn]),3)) == 0 ||
  59.          strncmp(argv[argn],"-rotate180",max(strlen(argv[argn]),8)) == 0 )
  60.         { }
  61.     else
  62.         pm_usage( usage );
  63.     argn++;
  64.     }
  65.  
  66.     if ( argn != argc )
  67.     {
  68.     ifd = pm_openr( argv[argn] );
  69.     argn++;
  70.     }
  71.     else
  72.     ifd = stdin;
  73.  
  74.     if ( argn != argc )
  75.     pm_usage( usage );
  76.  
  77.     xels = pnm_readpnm( ifd, &cols, &rows, &maxval, &format );
  78.     pm_close( ifd );
  79.  
  80.     /* Now go through the flags again, this time executing them. */
  81.     argn = 1;
  82.     while ( argn < argc && argv[argn][0] == '-' )
  83.     {
  84.     if ( strncmp(argv[argn],"-lr",max(strlen(argv[argn]),2)) == 0 ||
  85.          strncmp(argv[argn],"-leftright",max(strlen(argv[argn]),2)) == 0 )
  86.         leftright( xels, rows, cols );
  87.     else if ( strncmp(argv[argn],"-tb",max(strlen(argv[argn]),3)) == 0 ||
  88.          strncmp(argv[argn],"-topbottom",max(strlen(argv[argn]),3)) == 0 )
  89.         topbottom( xels, rows, cols );
  90.     else if ( strncmp(argv[argn],"-xy",max(strlen(argv[argn]),2)) == 0 ||
  91.          strncmp(argv[argn],"-transpose",max(strlen(argv[argn]),3)) == 0 )
  92.         xels = transpose( xels, &rows, &cols );
  93.     else if ( strncmp(argv[argn],"-r90",max(strlen(argv[argn]),3)) == 0 ||
  94.          strncmp(argv[argn],"-rotate90",max(strlen(argv[argn]),8)) == 0 ||
  95.          strncmp(argv[argn],"-ccw",max(strlen(argv[argn]),3)) == 0 )
  96.         {
  97.         xels = transpose( xels, &rows, &cols );
  98.         topbottom( xels, rows, cols );
  99.         }
  100.     else if ( strncmp(argv[argn],"-r270",max(strlen(argv[argn]),3)) == 0 ||
  101.          strncmp(argv[argn],"-rotate270",max(strlen(argv[argn]),8)) == 0 ||
  102.          strncmp(argv[argn],"-cw",max(strlen(argv[argn]),3)) == 0 )
  103.         {
  104.         xels = transpose( xels, &rows, &cols );
  105.         leftright( xels, rows, cols );
  106.         }
  107.     else if ( strncmp(argv[argn],"-r180",max(strlen(argv[argn]),3)) == 0 ||
  108.          strncmp(argv[argn],"-rotate180",max(strlen(argv[argn]),8)) == 0 )
  109.         {
  110.         leftright( xels, rows, cols );
  111.         topbottom( xels, rows, cols );
  112.         }
  113.     else
  114.         pm_error( "shouldn't happen!", 0,0,0,0,0 );
  115.     argn++;
  116.     }
  117.  
  118.     /* All done. */
  119.     pnm_writepnm( stdout, xels, cols, rows, maxval, format );
  120.  
  121.     exit( 0 );
  122.     }
  123.  
  124. void
  125. leftright( xels, rows, cols )
  126. xel **xels;
  127. int rows, cols;
  128.     {
  129.     int row;
  130.     register int col;
  131.     register xel *x1P, *x2P;
  132.     xel p;
  133.  
  134.     for ( row = 0; row < rows; row++ )
  135.         for ( col = 0, x1P = xels[row], x2P = &(xels[row][cols-1]);
  136.           col < cols / 2;
  137.           col++, x1P++, x2P-- )
  138.         {
  139.         p = *x1P;
  140.         *x1P = *x2P;
  141.         *x2P = p;
  142.         }
  143.     }
  144.  
  145. void
  146. topbottom( xels, rows, cols )
  147. xel **xels;
  148. int rows, cols;
  149.     {
  150.     int row;
  151.     register int col;
  152.     register xel *x1P, *x2P;
  153.     xel p;
  154.  
  155.     for ( row = 0; row < rows / 2; row++ )
  156.         for ( col = 0, x1P = xels[row], x2P = xels[rows - 1 - row];
  157.           col < cols;
  158.           col++, x1P++, x2P++ )
  159.         {
  160.         p = *x1P;
  161.         *x1P = *x2P;
  162.         *x2P = p;
  163.         }
  164.     }
  165.  
  166. xel **
  167. transpose( xels, rowsP, colsP )
  168. xel **xels;
  169. int *rowsP, *colsP;
  170.     {
  171.     int row, t;
  172.     register int col;
  173.     register xel **newxels, *xP;
  174.  
  175.     newxels = pnm_allocarray( *rowsP, *colsP );    /* note parameter reversal */
  176.  
  177.     for ( row = 0; row < *rowsP; row++ )
  178.         for ( col = 0, xP = xels[row]; col < *colsP; col++, xP++ )
  179.         newxels[col][row] = *xP;    /* reversal here too */
  180.     
  181.     pnm_freearray( xels, *rowsP );
  182.     t = *rowsP;
  183.     *rowsP = *colsP;
  184.     *colsP = t;
  185.  
  186.     return newxels;
  187.     }
  188.