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

  1. /* cmuwmtopbm.c - read a CMU window manager 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 "cmuwm.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, depth, padright, row, col;
  24.     bit getbit();
  25.  
  26.     pm_progname = argv[0];
  27.  
  28.     if ( argc > 2 )
  29.     pm_usage( "[cmuwmfile]" );
  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(
  39.         "CMU window manager file has depth of %d, must be 1",
  40.         depth, 0,0,0,0 );
  41.  
  42.     pbm_writepbminit( stdout, cols, rows );
  43.     bitrow = pbm_allocrow( cols );
  44.  
  45.     for ( row = 0; row < rows; row++ )
  46.     {
  47.     /* Get data. */
  48.         for ( col = 0, bP = bitrow; col < cols; col++, bP++ )
  49.         *bP = getbit( ifd );
  50.     /* Discard line padding */
  51.         for ( col = 0; col < padright; col ++ )
  52.         (void) getbit( ifd );
  53.     pbm_writepbmrow( stdout, bitrow, cols );
  54.     }
  55.  
  56.     pm_close( ifd );
  57.  
  58.     exit( 0 );
  59.     }
  60.  
  61.  
  62. unsigned char item;
  63. int bitsperitem, bitshift;
  64.  
  65. getinit( file, colsP, rowsP, depthP, padrightP )
  66. FILE *file;
  67. int *colsP, *rowsP, *depthP, *padrightP;
  68.     {
  69.     long magic;
  70.     long get_big_long();
  71.     short get_big_short();
  72.  
  73.     magic = get_big_long( file );
  74.     if ( magic != CMUWM_MAGIC )
  75.     pm_error( "bad magic number in CMU window manager file", 0,0,0,0,0 );
  76.     *colsP = get_big_long( file );
  77.     *rowsP = get_big_long( file );
  78.     *depthP = get_big_short( file );
  79.     *padrightP = ( ( *colsP + 7 ) / 8 ) * 8 - *colsP;
  80.  
  81.     bitsperitem = 0;
  82.     }
  83.  
  84. bit
  85. getbit( file )
  86. FILE *file;
  87.     {
  88.     bit b;
  89.     unsigned char get_byte();
  90.  
  91.     if ( bitsperitem == 0 )
  92.     {
  93.     item = get_byte( file );
  94.     bitsperitem = 8;
  95.     bitshift = 7;
  96.     }
  97.     b = ( ( item >> bitshift) & 1 ) ? PBM_WHITE : PBM_BLACK;
  98.     bitsperitem--;
  99.     bitshift--;
  100.     return b;
  101.     }
  102.  
  103. unsigned char
  104. get_byte( f )
  105. FILE *f;
  106.     {
  107.     int i;
  108.  
  109.     i = getc( f );
  110.     if ( i == EOF )
  111.     pm_error( "premature EOF", 0,0,0,0,0 );
  112.  
  113.     return (unsigned char) i;
  114.     }
  115.  
  116. short
  117. get_big_short( f )
  118. FILE *f;
  119.     {
  120.     short s;
  121.  
  122.     s = get_byte( f ) << 8;
  123.     s |= get_byte( f );
  124.  
  125.     return s;
  126.     }
  127.  
  128. long
  129. get_big_long( f )
  130. FILE *f;
  131.     {
  132.     long l;
  133.  
  134.     l = get_byte( f ) << 24;
  135.     l |= get_byte( f ) << 16;
  136.     l |= get_byte( f ) << 8;
  137.     l |= get_byte( f );
  138.  
  139.     return l;
  140.     }
  141.