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

  1. /* ppmtoxwd.c - read a portable pixmap and produce a color X11 window dump
  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 "ppm.h"
  15. #include "ppmcmap.h"
  16. #include "x11wd.h"
  17.  
  18. #define MAXCOLORS 256
  19.  
  20. main( argc, argv )
  21. int argc;
  22. char *argv[];
  23.     {
  24.     FILE *ifd;
  25.     register pixel **pixels, *pP;
  26.     int argn, rows, cols, colors, depth, morecolors, i, row, col;
  27.     pixval maxval;
  28.     colorhash_table cht;
  29.     colorhist_vector chv;
  30.     X11WDFileHeader h11;
  31.     X11XColor color;
  32.  
  33.     pm_progname = argv[0];
  34.  
  35.     argn = 1;
  36.  
  37.     if ( argn < argc )
  38.     {
  39.     ifd = pm_openr( argv[1] );
  40.     argn++;
  41.     }
  42.     else
  43.     ifd = stdin;
  44.     
  45.     if ( argn != argc )
  46.     pm_usage( "[ppmfile]" );
  47.  
  48.     pixels = ppm_readppm( ifd, &cols, &rows, &maxval );
  49.  
  50.     pm_close( ifd );
  51.     
  52.     /* Figure out the colormap. */
  53.     fprintf( stderr, "(Computing colormap..." );
  54.     fflush( stderr );
  55.     chv = ppm_computecolorhist( pixels, cols, rows, MAXCOLORS, &colors );
  56.     if ( chv == (colorhist_vector) 0 )
  57.     {
  58.     fprintf(
  59.         stderr,
  60.         "  Too many colors!  Try running the pixmap through 'ppmquant 256'.\n" );
  61.     exit( 1 );
  62.     }
  63.     fprintf( stderr, "  Done.  %d colors found.)\n", colors );
  64.     /* Make a hash table for fast color lookup. */
  65.     cht = ppm_colorhisttocolorhash( chv, colors );
  66.     depth = colorstobpp( colors );
  67.     morecolors = 1 << depth;
  68.  
  69.     /* Write out the header. */
  70.     h11.header_size = sizeof(h11);
  71.     h11.file_version = X11WD_FILE_VERSION;
  72.     h11.pixmap_format = ZPixmap;
  73.     h11.pixmap_depth = depth;
  74.     h11.pixmap_width = cols;
  75.     h11.pixmap_height = rows;
  76.     h11.xoffset = 0;
  77.     h11.byte_order = LSBFirst;
  78.     h11.bitmap_unit = 8;
  79.     h11.bitmap_bit_order = LSBFirst;
  80.     h11.bitmap_pad = 8;
  81.     h11.bits_per_pixel = 8;
  82.     h11.bytes_per_line = cols;
  83.     h11.visual_class = PseudoColor;
  84.     h11.red_mask = 0;
  85.     h11.green_mask = 0;
  86.     h11.blue_mask = 0;
  87.     h11.bits_per_rgb = h11.pixmap_depth;
  88.     h11.colormap_entries = morecolors;
  89.     h11.ncolors = colors;
  90.     h11.window_width = cols;
  91.     h11.window_height = rows;
  92.     h11.window_x = 0;
  93.     h11.window_y = 0;
  94.     h11.window_bdrwidth = 0;
  95.     fwrite( &h11, sizeof(h11), 1, stdout );
  96.  
  97.     /* Write out the colormap. */
  98.     color.flags = 7;
  99.     color.pad = 0;
  100.     for ( i = 0; i < colors; i++ )
  101.     {
  102.     color.pixel = i;
  103.     color.red = PPM_GETR( chv[i].color );
  104.     color.green = PPM_GETG( chv[i].color );
  105.     color.blue = PPM_GETB( chv[i].color );
  106.     if ( maxval != 65535 )
  107.         {
  108.         color.red = (long) color.red * 65535 / maxval;
  109.         color.green = (long) color.green * 65535 / maxval;
  110.         color.blue = (long) color.blue * 65535 / maxval;
  111.         }
  112.     fwrite( &color, sizeof(color), 1, stdout );
  113.     }
  114.     for ( ; i < morecolors; i++ )
  115.     {
  116.     color.pixel = i;
  117.     color.red = 0;
  118.     color.green = 0;
  119.     color.blue = 0;
  120.     fwrite( &color, sizeof(color), 1, stdout );
  121.     }
  122.  
  123.     /* Finally, write out the data. */
  124.     for ( row = 0; row < rows; row++ )
  125.         for ( col = 0, pP = pixels[row]; col < cols; col++, pP++ )
  126.         putchar( ppm_lookupcolor( cht, *pP ) );
  127.  
  128.     exit( 0 );
  129.     }
  130.  
  131. int
  132. colorstobpp( colors )
  133. int colors;
  134.     {
  135.     int bpp;
  136.  
  137.     if ( colors <= 2 )
  138.     bpp = 1;
  139.     else if ( colors <= 4 )
  140.     bpp = 2;
  141.     else if ( colors <= 8 )
  142.     bpp = 3;
  143.     else if ( colors <= 16 )
  144.     bpp = 4;
  145.     else if ( colors <= 32 )
  146.     bpp = 5;
  147.     else if ( colors <= 64 )
  148.     bpp = 6;
  149.     else if ( colors <= 128 )
  150.     bpp = 7;
  151.     else if ( colors <= 256 )
  152.     bpp = 8;
  153.     else
  154.     pm_error( "can't happen", 0,0,0,0,0 );
  155.  
  156.     return bpp;
  157.     }
  158.