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

  1. /* pbmtomgr.c - read a portable bitmap and produce a MGR 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. #include "pbm.h"
  15. #include "mgr.h"
  16.  
  17. main( argc, argv )
  18. int argc;
  19. char *argv[];
  20.     {
  21.     FILE *ifd;
  22.     register bit *bitrow, *bP;
  23.     int rows, cols, format, padright, row, col;
  24.  
  25.     pm_progname = argv[0];
  26.  
  27.     if ( argc > 2 )
  28.     pm_usage( "[pbmfile]" );
  29.  
  30.     if ( argc == 2 )
  31.     ifd = pm_openr( argv[1] );
  32.     else
  33.     ifd = stdin;
  34.  
  35.     pbm_readpbminit( ifd, &cols, &rows, &format );
  36.     bitrow = pbm_allocrow( cols );
  37.     
  38.     /* Round cols up to the nearest multiple of 8. */
  39.     padright = ( ( cols + 7 ) / 8 ) * 8 - cols;
  40.  
  41.     putinit( rows, cols );
  42.     for ( row = 0; row < rows; row++ )
  43.     {
  44.     pbm_readpbmrow( ifd, bitrow, cols, format );
  45.         for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  46.         putbit( *bP );
  47.     for ( col = 0; col < padright; col++ )
  48.         putbit( 0 );
  49.         }
  50.  
  51.     pm_close( ifd );
  52.  
  53.     putrest( );
  54.  
  55.     exit( 0 );
  56.     }
  57.  
  58.  
  59. unsigned char item;
  60. int bitsperitem, bitshift;
  61.  
  62. putinit( rows, cols )
  63. int rows, cols;
  64.     {
  65.     struct b_header head;
  66.  
  67.     head.magic[0] = 'y';
  68.     head.magic[1] = 'z';
  69.     head.h_wide = ( ( cols >> 6 ) & 0x3f ) + ' ';
  70.     head.l_wide = ( cols & 0x3f ) + ' ';
  71.     head.h_high = ( ( rows >> 6 ) & 0x3f ) + ' ';
  72.     head.l_high = ( rows & 0x3f ) + ' ';
  73.     head.depth = ( 1 & 0x3f ) + ' ';
  74.     head._reserved = ' ';
  75.     fwrite( &head, sizeof(head), 1, stdout );
  76.  
  77.     item = 0;
  78.     bitsperitem = 0;
  79.     bitshift = 7;
  80.     }
  81.  
  82. putbit( b )
  83. bit b;
  84.     {
  85.     if ( bitsperitem == 8 )
  86.     putitem( );
  87.     bitsperitem++;
  88.     if ( b == PBM_BLACK )
  89.     item += 1 << bitshift;
  90.     bitshift--;
  91.     }
  92.  
  93. putrest( )
  94.     {
  95.     if ( bitsperitem > 0 )
  96.     putitem( );
  97.     }
  98.  
  99. putitem( )
  100.     {
  101.     fwrite( &item, sizeof(item), 1, stdout );
  102.     item = 0;
  103.     bitsperitem = 0;
  104.     bitshift = 7;
  105.     }
  106.