home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / netpbma.zip / pnm / pnmtosir.c < prev    next >
C/C++ Source or Header  |  1993-12-09  |  4KB  |  150 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. #include "ppmcmap.h"
  16.  
  17. #define MAXCOLORS 256
  18.  
  19. int main( argc, argv )
  20. int argc;
  21. char* argv[];
  22. {
  23.     FILE* ifp;
  24.     xel** xels;
  25.     register xel* xP;
  26.     char* dumpname;
  27.     int rows, cols, format, row, col;
  28.     int i, m, n;
  29.     int grayscale;
  30.     xelval maxval;
  31.     char* usage = "[pnmfile]";
  32.     unsigned char ub;
  33.     unsigned short Header[16];
  34.     unsigned short LutHeader[16];
  35.     unsigned short Lut[2048];
  36.  
  37.     pnm_init( &argc, argv );
  38.  
  39.     if ( argc > 2 )
  40.     pm_usage( usage );
  41.  
  42.     if ( argc == 2 )
  43.     {
  44.     dumpname = argv[1];
  45.     ifp = pm_openr( argv[1] );
  46.     }
  47.     else
  48.     {
  49.     dumpname = "Standard Input";
  50.     ifp = stdin;
  51.     }
  52.     
  53.     xels = pnm_readpnm( ifp, &cols, &rows, &maxval, &format );
  54.     pm_close( ifp );
  55.     
  56.     /* Figure out the colormap. */
  57.     switch ( PNM_FORMAT_TYPE(format) )
  58.     {
  59.     case PPM_TYPE:
  60.     grayscale = 0;
  61.     pm_message( "Writing a 24-bit SIR format (MGI TYPE 11)",0,0,0,0,0 );
  62.     break;
  63.  
  64.         case PGM_TYPE:
  65.         grayscale = 1;
  66.         pm_message( "Writing a grayscale SIR format (MGI TYPE 17)",0,0,0,0,0 );
  67.         break;
  68.  
  69.     default:
  70.     grayscale = 1;
  71.         pm_message( "Writing a monochrome SIR format (MGI TYPE 17)",0,0,0,0,0 );
  72.     break;
  73.     }
  74.  
  75.     /* Set up the header. */
  76.     Header[0] = 0x3a4f;
  77.     Header[1] = 0;
  78.     if (grayscale)
  79.         Header[2] = 17;
  80.     else
  81.     Header[2] = 11;
  82.     Header[3] = cols;
  83.     Header[4] = rows;
  84.     Header[5] = 0;
  85.     Header[6] = 1;
  86.     Header[7] = 6;
  87.     Header[8] = 0;
  88.     Header[9] = 0;
  89.     for (n = 0; n < 10; n++)
  90.         pm_writelittleshort(stdout,Header[n]);
  91.     for (n = 10; n < 256; n++)
  92.         pm_writelittleshort(stdout,0);
  93.  
  94.     /* Create color map */
  95.     LutHeader[0] = 0x1524;
  96.     LutHeader[1] = 0;
  97.     LutHeader[2] = 5;
  98.     LutHeader[3] = 256;
  99.     LutHeader[4] = 256;
  100.     for (n = 0; n < 5; n++)
  101.         pm_writelittleshort(stdout,LutHeader[n]);
  102.     for (n = 5; n < 256; n++)
  103.         pm_writelittleshort(stdout,0);
  104.  
  105.     for(n = 0; n < 3; n ++)
  106.         for (m = 0; m < 256; m++)
  107.             Lut[m * 4 + n] = m << 8;
  108.     for (n = 0; n < 1024; n++)
  109.         pm_writelittleshort(stdout,Lut[n]);
  110.  
  111.     /* Finally, write out the data. */
  112.     switch ( PNM_FORMAT_TYPE(format) )
  113.     {
  114.     case PPM_TYPE:
  115.         for ( row = 0; row < rows; ++row )
  116.         for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  117.         {
  118.             ub = (char) ( PPM_GETR( *xP ) * ( 255 / maxval ) ); 
  119.             fputc( ub, stdout );
  120.         }
  121.             for ( row = 0; row < rows; ++row )
  122.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  123.                 {  
  124.                     ub = (char) ( PPM_GETG( *xP ) * ( 255 / maxval ) );
  125.                     fputc( ub, stdout );
  126.                 }
  127.             for ( row = 0; row < rows; ++row )
  128.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  129.                 {  
  130.                     ub = (char) ( PPM_GETB( *xP ) * ( 255 / maxval ) );
  131.                     fputc( ub, stdout );
  132.                 }
  133.         break;
  134.  
  135.         default:
  136.             for ( row = 0; row < rows; ++row )
  137.                 for ( col = 0, xP = xels[row]; col < cols; ++col, ++xP )
  138.                 {
  139.             register unsigned long val;
  140.  
  141.             val = PNM_GET1( *xP );
  142.                     ub = (char) ( val * ( 255 / maxval ) );
  143.                     fputc( ub, stdout );
  144.                 }
  145.             break;
  146.     }
  147.  
  148.     exit( 0 );
  149. }
  150.