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

  1. /* mgrtopbm.c - read a MGR bitmap and produce 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. #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.     bit getbit();
  24.     int rows, cols, depth, padright, row, col;
  25.  
  26.     pm_progname = argv[0];
  27.  
  28.     if ( argc > 2 )
  29.     pm_usage( "[mgrfile]" );
  30.  
  31.     if ( argc == 2 )
  32.     ifd = pm_openr( argv[1] );
  33.     else
  34.     ifd = stdin;
  35.  
  36.     getinit( ifd, &cols, &rows, &depth, &padright );
  37.     if ( depth != 1 )
  38.     pm_error( "MGR file has depth of %d, must be 1", depth, 0,0,0,0 );
  39.  
  40.     pbm_writepbminit( stdout, cols, rows );
  41.     bitrow = pbm_allocrow( cols );
  42.  
  43.     for ( row = 0; row < rows; row++ )
  44.     {
  45.     /* Get data, bit-reversed within each byte. */
  46.         for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  47.         *bP = getbit( ifd );
  48.     /* Discard line padding */
  49.         for ( col = 0; col < padright; col ++ )
  50.         (void) getbit( ifd );
  51.     pbm_writepbmrow( stdout, bitrow, cols );
  52.     }
  53.  
  54.     pm_close( ifd );
  55.  
  56.     exit( 0 );
  57.     }
  58.  
  59.  
  60. unsigned char item;
  61. int bitsperitem, bitshift;
  62.  
  63. getinit( file, colsP, rowsP, depthP, padrightP )
  64. FILE *file;
  65. int *colsP, *rowsP, *depthP, *padrightP;
  66.     {
  67.     struct b_header head;
  68.     int pad;
  69.  
  70.     if ( fread( &head, sizeof(struct old_b_header), 1, file ) != 1 )
  71.     {
  72.     perror( "reading header" );
  73.     exit( 1 );
  74.     }
  75.     if ( head.magic[0] == 'y' && head.magic[1] == 'z' )
  76.     { /* new style bitmap */
  77.     if ( fread( &head.depth, sizeof(head) - sizeof(struct old_b_header), 1, file ) != 1 )
  78.         {
  79.         perror( "reading rest of header" );
  80.         exit( 1 );
  81.         }
  82.     *depthP = (int) head.depth - ' ';
  83.     pad = 8;
  84.     }
  85.     else if ( head.magic[0] == 'x' && head.magic[1] == 'z' )
  86.     { /* old style bitmap with 32-bit padding */
  87.     *depthP = 1;
  88.     pad = 32;
  89.     }
  90.     else if ( head.magic[0] == 'z' && head.magic[1] == 'z' )
  91.     { /* old style bitmap with 16-bit padding */
  92.     *depthP = 1;
  93.     pad = 16;
  94.     }
  95.     else if ( head.magic[0] == 'z' && head.magic[1] == 'y' )
  96.     { /* old style 8-bit pixmap with 16-bit padding */
  97.     *depthP = 8;
  98.     pad = 16;
  99.     }
  100.     else
  101.     pm_error(
  102.         "bad magic chars in MGR file: '%c%c'",
  103.         head.magic[0], head.magic[1], 0,0,0 );
  104.     *colsP = ( ( (int) head.h_wide - ' ' ) << 6 ) + ( (int) head.l_wide - ' ' );
  105.     *rowsP = ( ( (int) head.h_high - ' ' ) << 6 ) + ( (int) head.l_high - ' ' );
  106.     *padrightP = ( ( *colsP + pad - 1 ) / pad ) * pad - *colsP;
  107.  
  108.     bitsperitem = 8;
  109.     }
  110.  
  111. bit
  112. getbit( file )
  113. FILE *file;
  114.     {
  115.     bit b;
  116.  
  117.     if ( bitsperitem == 8 )
  118.     {
  119.     item = getc( file );
  120.     bitsperitem = 0;
  121.     bitshift = 7;
  122.     }
  123.     bitsperitem++;
  124.     b = ( ( item >> bitshift) & 1 ) ? PBM_BLACK : PBM_WHITE;
  125.     bitshift--;
  126.     return b;
  127.     }
  128.