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

  1. /* pbmpaste.c - paste a rectangle into a portable bitmap
  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 "pbm.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 *ifd1, *ifd2;
  28.     register bit *bitrow1, **bits2, *b1P, *b2P;
  29.     int argn, rows1, cols1, format1, x, y, rows2, cols2, row, col;
  30.     char function;
  31.     char *usage = "[-replace|-or|-and|-xor] frompbmfile x y [intopbmfile]";
  32.  
  33.     pm_progname = argv[0];
  34.  
  35.     argn = 1;
  36.     function = 'r';
  37.  
  38.     /* Check for flags. */
  39.     if ( argn < argc && argv[argn][0] == '-' )
  40.     {
  41.     if ( strncmp(argv[argn],"-replace",max(strlen(argv[argn]),2)) == 0 )
  42.         function = 'r';
  43.     else if ( strncmp(argv[argn],"-or",max(strlen(argv[argn]),2)) == 0 )
  44.         function = 'o';
  45.     else if ( strncmp(argv[argn],"-and",max(strlen(argv[argn]),2)) == 0 )
  46.         function = 'a';
  47.     else if ( strncmp(argv[argn],"-xor",max(strlen(argv[argn]),2)) == 0 )
  48.         function = 'x';
  49.     else
  50.         pm_usage( usage );
  51.     argn++;
  52.     }
  53.  
  54.     if ( argn == argc )
  55.     pm_usage( usage );
  56.     ifd1 = pm_openr( argv[argn] );
  57.     pbm_readpbminit( ifd1, &cols1, &rows1, &format1 );
  58.     bitrow1 = pbm_allocrow( cols1 );
  59.     argn++;
  60.  
  61.     if ( argn == argc )
  62.     pm_usage( usage );
  63.     if ( sscanf( argv[argn], "%d", &x ) != 1 )
  64.     pm_usage( usage );
  65.     argn++;
  66.     if ( argn == argc )
  67.     pm_usage( usage );
  68.     if ( sscanf( argv[argn], "%d", &y ) != 1 )
  69.     pm_usage( usage );
  70.     argn++;
  71.  
  72.     if ( argn == argc )
  73.     ifd2 = stdin;
  74.     else
  75.     {
  76.     ifd2 = pm_openr( argv[argn] );
  77.     argn++;
  78.     }
  79.     bits2 = pbm_readpbm( ifd2, &cols2, &rows2 );
  80.     pm_close( ifd2 );
  81.  
  82.     if ( x <= -cols2 )
  83.     pm_error(
  84.         "x is too negative -- the second bitmap has only %d cols",
  85.         cols2, 0,0,0,0 );
  86.     if ( y <= -rows2 )
  87.     pm_error(
  88.         "y is too negative -- the second bitmap has only %d rows",
  89.         rows2, 0,0,0,0 );
  90.     if ( x < 0 )
  91.     x = cols2 - x;
  92.     if ( y < 0 )
  93.     y = rows2 - y;
  94.  
  95.     if ( x >= cols2 )
  96.     pm_error(
  97.         "x is too large -- the second bitmap has only %d cols",
  98.         cols2, 0,0,0,0 );
  99.     if ( y >= rows2 )
  100.     pm_error(
  101.         "y is too large -- the second bitmap has only %d rows",
  102.         rows2, 0,0,0,0 );
  103.     if ( x + cols1 > cols2 )
  104.     pm_error(
  105.         "x + width is too large by %d pixels", x + cols1 - cols2, 0,0,0,0 );
  106.     if ( y + rows1 > rows2 )
  107.     pm_error(
  108.         "y + height is too large by %d pixels", y + rows1 - rows2, 0,0,0,0);
  109.  
  110.     if ( argn != argc )
  111.     pm_usage( usage );
  112.  
  113.     for ( row = 0; row < rows1; row++ )
  114.     {
  115.     pbm_readpbmrow( ifd1, bitrow1, cols1, format1 );
  116.         for ( col = 0, b1P = bitrow1, b2P = &(bits2[row+y][x]); col < cols1; col++, b1P++, b2P++ )
  117.         switch ( function )
  118.         {
  119.         case 'r':
  120.         *b2P = *b1P;
  121.         break;
  122.  
  123.         case 'o':
  124.         *b2P = ( *b1P == PBM_WHITE || *b2P == PBM_WHITE ?
  125.              PBM_WHITE : PBM_BLACK );
  126.         break;
  127.  
  128.         case 'a':
  129.         *b2P = ( *b1P == PBM_WHITE && *b2P == PBM_WHITE ?
  130.              PBM_WHITE : PBM_BLACK );
  131.         break;
  132.  
  133.         case 'x':
  134.         *b2P = ( ( *b1P == PBM_WHITE && *b2P != PBM_WHITE ) ||
  135.              ( *b1P != PBM_WHITE && *b2P == PBM_WHITE ) ?
  136.              PBM_WHITE : PBM_BLACK );
  137.         break;
  138.  
  139.         default:
  140.         pm_error( "can't happen", 0,0,0,0,0 );
  141.         }
  142.     }
  143.  
  144.     pm_close( ifd1 );
  145.  
  146.     pbm_writepbm( stdout, bits2, cols2, rows2 );
  147.  
  148.     exit( 0 );
  149.     }
  150.