home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / utilities / utilsm / netpbmsca / pnm / c / pnmtosir < prev    next >
Encoding:
Text File  |  1993-10-06  |  3.8 KB  |  159 lines

  1. /* pnmtosir.c - read a portable anymap and produce a Solitaire Image Recorder
  2. **        file (MGI TYPE 11 or MGI TYPE 17)
  3. **
  4. ** Copyright (C) 1991 by Marvin Landis
  5. **
  6. ** Permission to use, copy, modify, and distribute this software and its
  7. ** documentation for any purpose and without fee is hereby granted, provided
  8. ** that the above copyright notice appear in all copies and that both that
  9. ** copyright notice and this permission notice appear in supporting
  10. ** documentation.  This software is provided "as is" without express or
  11. ** implied warranty.
  12. */
  13.  
  14. #include "pnm.h"
  15.  
  16. #ifdef PPM
  17. #include "ppmcmap.h"
  18. #define MAXCOLORS 256
  19. #endif /*PPM*/
  20.  
  21. int
  22. main( argc, argv )
  23. int argc;
  24. char* argv[];
  25. {
  26.     FILE* ifp;
  27.     xel** xels;
  28.     register xel* xP;
  29.     char* dumpname;
  30.     int rows, cols, format, row, col;
  31.     int i, m, n;
  32.     int grayscale;
  33.     xelval maxval;
  34.     char* usage = "[pnmfile]";
  35.     unsigned char ub;
  36.     unsigned short Header[16];
  37.     unsigned short LutHeader[16];
  38.     unsigned short Lut[2048];
  39.  
  40.     pnm_init( &argc, argv );
  41.  
  42.     if ( argc > 2 )
  43.     pm_usage( usage );
  44.  
  45.     if ( argc == 2 )
  46.     {
  47.     dumpname = argv[1];
  48.     ifp = pm_openr( argv[1] );
  49.     }
  50.     else
  51.     {
  52.     dumpname = "Standard Input";
  53.     ifp = stdin;
  54.     }
  55.  
  56.     xels = pnm_readpnm( ifp, &cols, &rows, &maxval, &format );
  57.     pm_close( ifp );
  58.  
  59.     /* Figure out the colormap. */
  60.     switch ( PNM_FORMAT_TYPE(format) )
  61.     {
  62. #ifdef PPM
  63.     case PPM_TYPE:
  64.     grayscale = 0;
  65.     pm_message( "Writing a 24-bit SIR format (MGI TYPE 11)",0,0,0,0,0 );
  66.     break;
  67. #endif /*PPM*/
  68.  
  69. #ifdef PGM
  70.         case PGM_TYPE:
  71.         grayscale = 1;
  72.         pm_message( "Writing a grayscale SIR format (MGI TYPE 17)",0,0,0,0,0 );
  73.         break;
  74. #endif /*PGM*/
  75.  
  76.     default:
  77.     grayscale = 1;
  78.         pm_message( "Writing a monochrome SIR format (MGI TYPE 17)",0,0,0,0,0 );
  79.     break;
  80.     }
  81.  
  82.     /* Set up the header. */
  83.     Header[0] = 0x3a4f;
  84.     Header[1] = 0;
  85.     if (grayscale)
  86.         Header[2] = 17;
  87.     else
  88.     Header[2] = 11;
  89.     Header[3] = cols;
  90.     Header[4] = rows;
  91.     Header[5] = 0;
  92.     Header[6] = 1;
  93.     Header[7] = 6;
  94.     Header[8] = 0;
  95.     Header[9] = 0;
  96.     for (n = 0; n < 10; n++)
  97.         pm_writelittleshort(stdout,Header[n]);
  98.     for (n = 10; n < 256; n++)
  99.         pm_writelittleshort(stdout,0);
  100.  
  101.     /* Create color map */
  102.     LutHeader[0] = 0x1524;
  103.     LutHeader[1] = 0;
  104.     LutHeader[2] = 5;
  105.     LutHeader[3] = 256;
  106.     LutHeader[4] = 256;
  107.     for (n = 0; n < 5; n++)
  108.         pm_writelittleshort(stdout,LutHeader[n]);
  109.     for (n = 5; n < 256; n++)
  110.         pm_writelittleshort(stdout,0);
  111.  
  112.     for(n = 0; n < 3; n ++)
  113.         for (m = 0; m < 256; m++)
  114.             Lut[m * 4 + n] = m << 8;
  115.     for (n = 0; n < 1024; n++)
  116.         pm_writelittleshort(stdout,Lut[n]);
  117.  
  118.     /* Finally, write out the data. */
  119.     switch ( PNM_FORMAT_TYPE(format) )
  120.     {
  121. #ifdef PPM
  122.     case PPM_TYPE:
  123.         for ( row = 0; row < rows; ++row )
  124.         for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  125.         {
  126.             ub = (char) ( PPM_GETR( *xP ) * ( 255 / maxval ) );
  127.             fputc( ub, stdout );
  128.         }
  129.             for ( row = 0; row < rows; ++row )
  130.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  131.                 {
  132.                     ub = (char) ( PPM_GETG( *xP ) * ( 255 / maxval ) );
  133.                     fputc( ub, stdout );
  134.                 }
  135.             for ( row = 0; row < rows; ++row )
  136.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  137.                 {
  138.                     ub = (char) ( PPM_GETB( *xP ) * ( 255 / maxval ) );
  139.                     fputc( ub, stdout );
  140.                 }
  141.         break;
  142. #endif /*PPM*/
  143.  
  144.         default:
  145.             for ( row = 0; row < rows; ++row )
  146.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  147.                 {
  148.             register unsigned long val;
  149.  
  150.             val = PNM_GET1( *xP );
  151.                     ub = (char) ( val * ( 255 / maxval ) );
  152.                     fputc( ub, stdout );
  153.                 }
  154.             break;
  155.     }
  156.  
  157.     exit( 0 );
  158. }
  159.