home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume5 / pbm3 / part2 / pbmtoicon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-03  |  2.3 KB  |  120 lines

  1. /* pbmtoicon.c - read a portable bitmap and produce a Sun icon file
  2. **
  3. ** Copyright (C) 1988 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.  
  16. main( argc, argv )
  17. int argc;
  18. char *argv[];
  19.     {
  20.     FILE *ifd;
  21.     bit **bits;
  22.     int rows, cols, pad, padleft, padright, row, col;
  23.     char ch;
  24.  
  25.     if ( argc > 2 )
  26.     {
  27.     fprintf( stderr, "usage:  %s [pbmfile]\n", argv[0] );
  28.     exit( 1 );
  29.     }
  30.  
  31.     if ( argc == 2 )
  32.     {
  33.         ifd = fopen( argv[1], "r" );
  34.         if ( ifd == NULL )
  35.         {
  36.         fprintf( stderr, "%s: can't open.\n", argv[1] );
  37.         exit( 1 );
  38.         }
  39.     }
  40.     else
  41.     ifd = stdin;
  42.  
  43.     bits = pbm_readpbm( ifd, &cols, &rows );
  44.  
  45.     if ( ifd != stdin )
  46.     fclose( ifd );
  47.     
  48.     /* Round cols up to the nearest multiple of 16. */
  49.     pad = ( ( cols + 15 ) / 16 ) * 16 - cols;
  50.     padleft = pad / 2;
  51.     padright = pad - padleft;
  52.  
  53.     printf( "/* Format_version=1, Width=%d, Height=%d", cols + pad, rows );
  54.     printf( ", Depth=1, Valid_bits_per_item=16\n */\n" );
  55.  
  56.     putinit( );
  57.     for ( row = 0; row < rows; row++ )
  58.     {
  59.     for ( col = 0; col < padleft; col++ )
  60.         putbit( 0 );
  61.         for ( col = 0; col < cols; col++ )
  62.         putbit( bits[row][col] );
  63.     for ( col = 0; col < padright; col++ )
  64.         putbit( 0 );
  65.         }
  66.     putrest( );
  67.  
  68.     exit( 0 );
  69.     }
  70.  
  71.  
  72. int item, bitsperitem, bitshift, itemsperline, firstitem;
  73.  
  74. putinit( )
  75.     {
  76.     itemsperline = 0;
  77.     bitsperitem = 0;
  78.     item = 0;
  79.     bitshift = 15;
  80.     firstitem = 1;
  81.     }
  82.  
  83. putbit( b )
  84. bit b;
  85.     {
  86.     if ( bitsperitem == 16 )
  87.     putitem( );
  88.     bitsperitem++;
  89.     if ( b )
  90.     item += 1 << bitshift;
  91.     bitshift--;
  92.     }
  93.  
  94. putrest( )
  95.     {
  96.     if ( bitsperitem > 0 )
  97.     putitem( );
  98.     putchar( '\n' );
  99.     }
  100.  
  101. putitem( )
  102.     {
  103.     if ( firstitem )
  104.     firstitem = 0;
  105.     else
  106.     putchar( ',' );
  107.     if ( itemsperline == 8 )
  108.     {
  109.     putchar( '\n' );
  110.     itemsperline = 0;
  111.     }
  112.     if ( itemsperline == 0 )
  113.     putchar( '\t' );
  114.     itemsperline++;
  115.     printf( "0x%04x", item );
  116.     bitsperitem = 0;
  117.     item = 0;
  118.     bitshift = 15;
  119.     }
  120.